{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# StackingCVClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "An ensemble-learning meta-classifier for stacking using cross-validation to prepare the inputs for the level-2 classifier to prevent overfitting."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> from mlxtend.classifier import StackingCVClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Overview"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Stacking is an ensemble learning technique to combine multiple classification models via a meta-classifier. The `StackingCVClassifier` extends the standard stacking algorithm (implemented as [`StackingClassifier`](StackingClassifier.md)) using cross-validation to prepare the input data for the level-2 classifier. \n",
    "\n",
    "In the standard stacking procedure, the first-level classifiers are fit to the same training set that is used prepare the inputs for the second-level classifier, which may lead to overfitting. The `StackingCVClassifier`, however, uses the concept of cross-validation: the dataset is split into *k* folds, and in *k* successive rounds, *k-1* folds are used to fit the first level classifier; in each round, the first-level classifiers are then applied to the remaining 1 subset that was not used for model fitting in each iteration. The resulting predictions are then stacked and provided -- as input data -- to the second-level classifier. After the training of the `StackingCVClassifier`, the first-level classifiers are fit to the entire dataset as illustrated in the figure below."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](./StackingCVClassifier_files/stacking_cv_classification_overview.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "More formally, the Stacking Cross-Validation algorithm can be summarized as follows (source: [1]):\n",
    "    \n",
    "![](./StackingCVClassifier_files/stacking_cv_algorithm.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### References\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- [1] Tang, J., S. Alelyani, and H. Liu. \"[Data Classification: Algorithms and Applications.](https://books.google.com/books?id=nwQZCwAAQBAJ&lpg=PA500&dq=stacking%20classifier%20subsets&pg=PA499#v=onepage&q&f=false)\" Data Mining and Knowledge Discovery Series, CRC Press (2015): pp. 498-500.\n",
    "- [2] Wolpert, David H. \"[Stacked generalization.](http://www.sciencedirect.com/science/article/pii/S0893608005800231)\" Neural networks 5.2 (1992): 241-259."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 1 - Simple Stacking CV Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "\n",
    "iris = datasets.load_iris()\n",
    "X, y = iris.data[:, 1:3], iris.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3-fold cross validation:\n",
      "\n",
      "Accuracy: 0.91 (+/- 0.01) [KNN]\n",
      "Accuracy: 0.95 (+/- 0.01) [Random Forest]\n",
      "Accuracy: 0.91 (+/- 0.02) [Naive Bayes]\n",
      "Accuracy: 0.93 (+/- 0.02) [StackingClassifier]\n"
     ]
    }
   ],
   "source": [
    "from sklearn import model_selection\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.naive_bayes import GaussianNB \n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from mlxtend.classifier import StackingCVClassifier\n",
    "import numpy as np\n",
    "import warnings\n",
    "\n",
    "warnings.simplefilter('ignore')\n",
    "\n",
    "RANDOM_SEED = 42\n",
    "\n",
    "clf1 = KNeighborsClassifier(n_neighbors=1)\n",
    "clf2 = RandomForestClassifier(random_state=RANDOM_SEED)\n",
    "clf3 = GaussianNB()\n",
    "lr = LogisticRegression()\n",
    "\n",
    "# Starting from v0.16.0, StackingCVRegressor supports\n",
    "# `random_state` to get deterministic result.\n",
    "sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],\n",
    "                            meta_classifier=lr,\n",
    "                            random_state=RANDOM_SEED)\n",
    "\n",
    "print('3-fold cross validation:\\n')\n",
    "\n",
    "for clf, label in zip([clf1, clf2, clf3, sclf], \n",
    "                      ['KNN', \n",
    "                       'Random Forest', \n",
    "                       'Naive Bayes',\n",
    "                       'StackingClassifier']):\n",
    "\n",
    "    scores = model_selection.cross_val_score(clf, X, y, \n",
    "                                              cv=3, scoring='accuracy')\n",
    "    print(\"Accuracy: %0.2f (+/- %0.2f) [%s]\" \n",
    "          % (scores.mean(), scores.std(), label))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from mlxtend.plotting import plot_decision_regions\n",
    "import matplotlib.gridspec as gridspec\n",
    "import itertools\n",
    "\n",
    "gs = gridspec.GridSpec(2, 2)\n",
    "\n",
    "fig = plt.figure(figsize=(10,8))\n",
    "\n",
    "for clf, lab, grd in zip([clf1, clf2, clf3, sclf], \n",
    "                         ['KNN', \n",
    "                          'Random Forest', \n",
    "                          'Naive Bayes',\n",
    "                          'StackingCVClassifier'],\n",
    "                          itertools.product([0, 1], repeat=2)):\n",
    "\n",
    "    clf.fit(X, y)\n",
    "    ax = plt.subplot(gs[grd[0], grd[1]])\n",
    "    fig = plot_decision_regions(X=X, y=y, clf=clf)\n",
    "    plt.title(lab)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 2 - Using Probabilities as Meta-Features"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Alternatively, the class-probabilities of the first-level classifiers can be used to train the meta-classifier (2nd-level classifier) by setting `use_probas=True`. For example, in a 3-class setting with 2 level-1 classifiers, these classifiers may make the following \"probability\" predictions for 1 training sample:\n",
    "\n",
    "- classifier 1: [0.2, 0.5, 0.3]\n",
    "- classifier 2: [0.3, 0.4, 0.4]\n",
    "\n",
    "This results in *k* features, where *k* = [n_classes * n_classifiers], by stacking these level-1 probabilities:\n",
    "\n",
    "- [0.2, 0.5, 0.3, 0.3, 0.4, 0.4]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3-fold cross validation:\n",
      "\n",
      "Accuracy: 0.91 (+/- 0.01) [KNN]\n",
      "Accuracy: 0.95 (+/- 0.01) [Random Forest]\n",
      "Accuracy: 0.91 (+/- 0.02) [Naive Bayes]\n",
      "Accuracy: 0.95 (+/- 0.02) [StackingClassifier]\n"
     ]
    }
   ],
   "source": [
    "clf1 = KNeighborsClassifier(n_neighbors=1)\n",
    "clf2 = RandomForestClassifier(random_state=1)\n",
    "clf3 = GaussianNB()\n",
    "lr = LogisticRegression()\n",
    "\n",
    "sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],\n",
    "                            use_probas=True,\n",
    "                            meta_classifier=lr,\n",
    "                            random_state=42)\n",
    "\n",
    "print('3-fold cross validation:\\n')\n",
    "\n",
    "for clf, label in zip([clf1, clf2, clf3, sclf], \n",
    "                      ['KNN', \n",
    "                       'Random Forest', \n",
    "                       'Naive Bayes',\n",
    "                       'StackingClassifier']):\n",
    "\n",
    "    scores = model_selection.cross_val_score(clf, X, y, \n",
    "                                              cv=3, scoring='accuracy')\n",
    "    print(\"Accuracy: %0.2f (+/- %0.2f) [%s]\" \n",
    "          % (scores.mean(), scores.std(), label))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 3 - Stacked CV Classification and GridSearch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The stack allows tuning hyper parameters of the base and meta models! A full list of tunable parameters can be obtained via `estimator.get_params().keys()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.947 +/- 0.03 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.933 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.940 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.940 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "Best parameters: {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "Accuracy: 0.95\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.naive_bayes import GaussianNB \n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from mlxtend.classifier import StackingCVClassifier\n",
    "\n",
    "# Initializing models\n",
    "\n",
    "clf1 = KNeighborsClassifier(n_neighbors=1)\n",
    "clf2 = RandomForestClassifier(random_state=RANDOM_SEED)\n",
    "clf3 = GaussianNB()\n",
    "lr = LogisticRegression()\n",
    "\n",
    "sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3], \n",
    "                            meta_classifier=lr,\n",
    "                            random_state=42)\n",
    "\n",
    "params = {'kneighborsclassifier__n_neighbors': [1, 5],\n",
    "          'randomforestclassifier__n_estimators': [10, 50],\n",
    "          'meta_classifier__C': [0.1, 10.0]}\n",
    "\n",
    "grid = GridSearchCV(estimator=sclf, \n",
    "                    param_grid=params, \n",
    "                    cv=5,\n",
    "                    refit=True)\n",
    "grid.fit(X, y)\n",
    "\n",
    "cv_keys = ('mean_test_score', 'std_test_score', 'params')\n",
    "\n",
    "for r, _ in enumerate(grid.cv_results_['mean_test_score']):\n",
    "    print(\"%0.3f +/- %0.2f %r\"\n",
    "          % (grid.cv_results_[cv_keys[0]][r],\n",
    "             grid.cv_results_[cv_keys[1]][r] / 2.0,\n",
    "             grid.cv_results_[cv_keys[2]][r]))\n",
    "\n",
    "print('Best parameters: %s' % grid.best_params_)\n",
    "print('Accuracy: %.2f' % grid.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In case we are planning to use a regression algorithm multiple times, all we need to do is to add an additional number suffix in the parameter grid as shown below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.940 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.940 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.940 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.940 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "0.960 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "0.960 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "Best parameters: {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "Accuracy: 0.96\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "# Initializing models\n",
    "\n",
    "clf1 = KNeighborsClassifier(n_neighbors=1)\n",
    "clf2 = RandomForestClassifier(random_state=RANDOM_SEED)\n",
    "clf3 = GaussianNB()\n",
    "lr = LogisticRegression()\n",
    "\n",
    "sclf = StackingCVClassifier(classifiers=[clf1, clf1, clf2, clf3], \n",
    "                            meta_classifier=lr,\n",
    "                            random_state=RANDOM_SEED)\n",
    "\n",
    "params = {'kneighborsclassifier-1__n_neighbors': [1, 5],\n",
    "          'kneighborsclassifier-2__n_neighbors': [1, 5],\n",
    "          'randomforestclassifier__n_estimators': [10, 50],\n",
    "          'meta_classifier__C': [0.1, 10.0]}\n",
    "\n",
    "grid = GridSearchCV(estimator=sclf, \n",
    "                    param_grid=params, \n",
    "                    cv=5,\n",
    "                    refit=True)\n",
    "grid.fit(X, y)\n",
    "\n",
    "cv_keys = ('mean_test_score', 'std_test_score', 'params')\n",
    "\n",
    "for r, _ in enumerate(grid.cv_results_['mean_test_score']):\n",
    "    print(\"%0.3f +/- %0.2f %r\"\n",
    "          % (grid.cv_results_[cv_keys[0]][r],\n",
    "             grid.cv_results_[cv_keys[1]][r] / 2.0,\n",
    "             grid.cv_results_[cv_keys[2]][r]))\n",
    "\n",
    "print('Best parameters: %s' % grid.best_params_)\n",
    "print('Accuracy: %.2f' % grid.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note**\n",
    "\n",
    "The `StackingClassifier` also enables grid search over the `classifiers` argument. When there are level-mixed hyperparameters, GridSearchCV will try to replace hyperparameters in a top-down order, i.e., classifers -> single base classifier -> classifier hyperparameter. For instance,  given a hyperparameter grid such as\n",
    "\n",
    "    params = {'randomforestclassifier__n_estimators': [1, 100],\n",
    "    'classifiers': [(clf1, clf1, clf1), (clf2, clf3)]}\n",
    "    \n",
    "it will first use the instance settings of either (clf1, clf1, clf1) or (clf2, clf3). Then it will replace the `'n_estimators'` settings for a matching classifier based on `'randomforestclassifier__n_estimators': [1, 100]`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 4 - Stacking of Classifiers that Operate on Different Feature Subsets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The different level-1 classifiers can be fit to different subsets of features in the training dataset. The following example illustrates how this can be done on a technical level using scikit-learn pipelines and the `ColumnSelector`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "StackingCVClassifier(classifiers=[Pipeline(memory=None,\n",
       "                                           steps=[('columnselector',\n",
       "                                                   ColumnSelector(cols=(0, 2),\n",
       "                                                                  drop_axis=False)),\n",
       "                                                  ('logisticregression',\n",
       "                                                   LogisticRegression(C=1.0,\n",
       "                                                                      class_weight=None,\n",
       "                                                                      dual=False,\n",
       "                                                                      fit_intercept=True,\n",
       "                                                                      intercept_scaling=1,\n",
       "                                                                      l1_ratio=None,\n",
       "                                                                      max_iter=100,\n",
       "                                                                      multi_class='auto',\n",
       "                                                                      n_jobs=None,\n",
       "                                                                      penalty='l2',\n",
       "                                                                      random_state=None,\n",
       "                                                                      solver='lbfgs',\n",
       "                                                                      tol=0.0...\n",
       "                                                        fit_intercept=True,\n",
       "                                                        intercept_scaling=1,\n",
       "                                                        l1_ratio=None,\n",
       "                                                        max_iter=100,\n",
       "                                                        multi_class='auto',\n",
       "                                                        n_jobs=None,\n",
       "                                                        penalty='l2',\n",
       "                                                        random_state=None,\n",
       "                                                        solver='lbfgs',\n",
       "                                                        tol=0.0001, verbose=0,\n",
       "                                                        warm_start=False),\n",
       "                     n_jobs=None, pre_dispatch='2*n_jobs', random_state=42,\n",
       "                     shuffle=True, store_train_meta_features=False,\n",
       "                     stratify=True, use_clones=True,\n",
       "                     use_features_in_secondary=False, use_probas=False,\n",
       "                     verbose=0)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "from mlxtend.classifier import StackingCVClassifier\n",
    "from mlxtend.feature_selection import ColumnSelector\n",
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "iris = load_iris()\n",
    "X = iris.data\n",
    "y = iris.target\n",
    "\n",
    "pipe1 = make_pipeline(ColumnSelector(cols=(0, 2)),\n",
    "                      LogisticRegression())\n",
    "pipe2 = make_pipeline(ColumnSelector(cols=(1, 2, 3)),\n",
    "                      LogisticRegression())\n",
    "\n",
    "sclf = StackingCVClassifier(classifiers=[pipe1, pipe2], \n",
    "                            meta_classifier=LogisticRegression(),\n",
    "                            random_state=42)\n",
    "\n",
    "sclf.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 5 -- ROC Curve with `decision_function`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Like other scikit-learn classifiers, the `StackingCVClassifier` has an `decision_function` method that can be used for plotting ROC curves. Note that the `decision_function` expects and requires the meta-classifier to implement a `decision_function`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import model_selection\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from mlxtend.classifier import StackingCVClassifier\n",
    "from sklearn.metrics import roc_curve, auc\n",
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn import datasets\n",
    "from sklearn.preprocessing import label_binarize\n",
    "from sklearn.multiclass import OneVsRestClassifier\n",
    "\n",
    "\n",
    "iris = datasets.load_iris()\n",
    "X, y = iris.data[:, [0, 1]], iris.target\n",
    "\n",
    "\n",
    "# Binarize the output\n",
    "y = label_binarize(y, classes=[0, 1, 2])\n",
    "n_classes = y.shape[1]\n",
    "\n",
    "\n",
    "\n",
    "RANDOM_SEED = 42\n",
    "\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y, test_size=0.33, random_state=RANDOM_SEED)\n",
    "\n",
    "clf1 =  LogisticRegression()\n",
    "clf2 = RandomForestClassifier(random_state=RANDOM_SEED)\n",
    "clf3 = SVC(random_state=RANDOM_SEED)\n",
    "lr = LogisticRegression()\n",
    "\n",
    "\n",
    "sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],\n",
    "                            meta_classifier=lr)\n",
    "\n",
    "\n",
    "# Learn to predict each class against the other\n",
    "classifier = OneVsRestClassifier(sclf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Using `predict_proba()`**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEWCAYAAAB42tAoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdd3gU1frA8e+bnkAgJBQRpLcAUiRSRAELRUBR0QuKWO9FRFHAi4hiQ7wqIiiCYEN+ylVUvCgiRUAQRZEivSMghF5TCAkp5/fHTMISUjaQzWw27+d58uxO2Zl3Jrv77pwz5xwxxqCUUkrlxs/pAJRSSnk3TRRKKaXypIlCKaVUnjRRKKWUypMmCqWUUnnSRKGUUipPmih8gIj0EZEfnY7DaSJSTUQSRcS/CPdZQ0SMiAQU1T49SUQ2iUiHi3idz74HRaSDiMQ6HYeTNFEUMhHZIyJn7C+sQyIyVURKe3Kfxpj/GmM6eXIf3sg+1zdlThtj9hpjShtj0p2Myyl2wqpzKdswxjQyxizJZz8XJMeS+h4sKTRReMYtxpjSQDOgOTDc4XguipO/kn3lF3pB6PlW3koThQcZYw4B87ESBgAiEiwiY0Rkr4gcFpHJIhLqsryHiKwVkXgR+UtEutjzy4rIxyJyUET2i8iozCIWEXlARH61n08WkTGucYjIdyIyxH5+uYh8IyJHRWS3iDzhst5LIjJDRKaJSDzwQPZjsuP41H793yIyQkT8XOJYJiLvikiciGwVkRuzvTavY1gmIuNE5ATwkojUFpGfROS4iBwTkf+KSIS9/mdANeB7++rt6ey/dEVkiYi8Ym83QUR+FJHyLvHcZx/DcRF5PvsVSrbjDhWRt+z140TkV9f/G9DH/p8eE5HnXF7XUkR+F5FT9nFPEJEgl+VGRB4TkR3ADnveOyKyz34PrBaR61zW9xeRZ+33RoK9/AoRWWqvss4+H73s9bvb76dTIvKbiDRx2dYeERkmIuuB0yIS4HoO7NhX2XEcFpGx9ksz93XK3lcb1/eg/dpGIrJARE7Yr302l/Oa6+fBjm25y//zUbGKxkLs6a/FumqPE5GlItLIZbtTReQ9EZlrx7hMRC4TkbdF5KT93mye7VwMF5HN9vJPMveTQ8y5foZ8ljFG/wrxD9gD3GQ/rwpsAN5xWf42MAuIBMKB74HX7GUtgTigI1YSrwI0sJd9C7wPlAIqAiuAR+xlDwC/2s/bAfsAsafLAWeAy+1trgZeAIKAWsAuoLO97ktAKnCbvW5oDsf3KfCdHXsNYDvwsEscacBgIBDoZR9PpJvHkAYMBAKAUKCOfS6CgQpYX1Bv53Su7ekagAEC7OklwF9APXt7S4DX7WUNgUTgWvtcjLGP/aZc/q8T7ddXAfyBa+y4Mvf5ob2PpkAKEG2/rgXQ2j6mGsAWYJDLdg2wAOv9EGrPuxeIsl/zFHAICLGXDcV6T9UHxN5flMu26rhs+yrgCNDKjvl++5wFu5y/tcAVLvvOOqfA70Bf+3lpoHVO5zmH92A4cNCOPcSebpXLec3r8+Bn/89fAuoCJ4HmLq99yH5NsL2dtS7LpgLH7PMfAvwE7Abus8/FKGBxtvfSRvtcRALLgFH2sg5ArEtMuX6GfPXP8QB87c9+wyUCCfaHaREQYS8T4DRQ22X9NsBu+/n7wLgctlkJ68sn1GXe3Zlv9GwfUgH2Au3s6X8BP9nPWwF7s217OPCJ/fwlYGkex+Zvx9HQZd4jwBKXOA5gJyl73gqgr5vHsDe3fdvr3AasyXau80sUI1yWDwDm2c9fAL5wWRYGnCWHRGF/OZwBmuawLHOfVbMdc+9cjmEQMNNl2gA35HPcJzP3DWwDeuSyXvZEMQl4Jds624D2LufvoRzev5mJYinwMlA+l2POLVHc7fp/yuO48vw8uOzrBFaCHZ7HtiLsmMra01OBD12WDwS2uExfCZzKdtz9Xaa7An/ZzztwLlHk+Rny1T8tl/SM24wxC0WkPfA5UB44hfWrOAxYLSKZ6wrWFzBYv2bm5LC96li/0A+6vM4P68rhPMYYIyLTsT6sS4F7gGku27lcRE65vMQf+MVl+oJtuiiP9Svqb5d5f2P9ys6039ifHpfll7t5DOftW0QqAuOB67B+OfphfWkWxCGX50lYv4yxY8ranzEmSUSO57KN8li/Sv8q6H5EpB4wFojB+t8HYP0idZX9uJ8C/mnHaIAydgxgvUfyisNVdeB+ERnoMi/I3m6O+87mYWAksFVEdgMvG2Nmu7Ffd2PM7/OAMWaPiCzG+uKemLWSVWT5KnCXvZ0Me1F5rKtYgMMu+zqTw3T2m0xcz0Xm+zY7dz5DPkfrKDzIGPMz1i+bzDqDY1hv0EbGmAj7r6yxKr7BeqPWzmFT+7B+jZd3eV0ZY0yjHNYF+AK4U0SqY/0C+sZlO7tdthFhjAk3xnR1DTuPQzqGVTxT3WVeNWC/y3QVcfnU28sPuHkM2ff9mj2viTGmDFaRjOSxfkEcxCoaBKw6CKzinpwcA5LJ+X+Tn0nAVqCufQzPcv4xgMtx2PURw4B/AOWMMRFYX3yZr8ntPZKTfcCr2f7fYcaYL3Lad3bGmB3GmLuxignfAGaISKm8XlPAGPP7PCAiXbGuMhYBb7q89h6gB3ATUBbrygMuPLcFcYXL88z3bXbufIZ8jiYKz3sb6CgizYwxGVhl2ePsX8uISBUR6Wyv+zHwoIjcKCJ+9rIGxpiDwI/AWyJSxl5W275iuYAxZg1wFPgImG+Myfz1swKItysJQ+2K0cYicrU7B2Ks206/Al4VkXA7EQ3h3BULWF8qT4hIoIjcBUQDcwp6DLZwrGK8UyJSBat83tVhrDLiizEDuEVErhGrcvllcvmSsf9vU4CxdkWmv12BG+zGfsKBeCBRRBoAj7qxfhrW/y9ARF7AuqLI9BHwiojUFUsTEclMcNnPx4dAfxFpZa9bSkS6iUi4G3EjIveKSAX7+DPfQ+l2bBnkfu5nA5eJyCC7sjpcRFplXym/z4NYNx58jHV1dT/W/yvzCzkc64fHcayrkv+4c0z5eExEqopIJFZC/zKHdS7pM1RcaaLwMGPMUawK4OftWcOAncByse4sWohVMYkxZgXwIDAO61fkz5z79X4fVrHBZqzilxlA5Tx2/QXWr63PXWJJB27BugtrN9Yvuo+wfpG5ayBWufIu4Fd7+1Nclv+BVfF4DKto4E5jTGaRTkGP4WWsCtk44Afgf9mWvwaMEOuOnn8X4Bgwxmyyj2U61tVFAlbFb0ouL/k3ViXySqwy8zdw7/Pzb6xfvwlYX4o5ffm4mg/MxbpJ4G+sKxnXIpGxWMn6R6wE9DFWJTpYdUz/Z5+PfxhjVmHVUU3AOt87yeFOtjx0ATaJSCLwDla9S7IxJgnrf7vM3ldr1xcZYxKwbkK4BatIbgdwfS77yPXzAHwAfGeMmWO/hx4GPrIT46f2+dmP9X5aXoDjys3nWOd1l/03KvsKhfQZKnYy74xR6pKJyAPAP40x1zodS0GJ1SjyFFYR0W6n41FFS0T2YL13FzodizfSKwpVYonILSISZpe7j8G6YtjjbFRKeR9NFKok64FVYXkAq7ist9FLbKUuoEVPSiml8qRXFEoppfJU7BrclS9f3tSoUcPpMJRSqlhZvXr1MWNMhYt5bbFLFDVq1GDVqlVOh6GUUsWKiPyd/1o506InpZRSedJEoZRSKk+aKJRSSuVJE4VSSqk8aaJQSimVJ00USiml8uSxRCEiU0TkiIhszGW5iMh4EdkpIutF5CpPxaKUUuriefKKYipWN8W5uRmrf526QD+sAV6UUkoVBmMgJR6Ob+XszkvrFNdjDe6MMUtFpEYeq/QAPrU7YVsuIhEiUtke4EYppVRuUk9D4oFzf6cPQOJB+/HAucfU0wz9viNrDuQ17Ev+nGyZXYXzB2SJteddkChEpB/WVQfVqlUrkuCUUqrIpZ6B0wfP/7JPPGDNc50+G+/e9gJCaVxLGL+sxiWF5WSiyGnYyRy7sjXGfIA12hUxMTHa3a1SqnhJS4GkQzlcBRw4PzEkn3Rve/7BUPpyKHW5/VjZeix9OZsPRPDnjkDufagNBJXhPqD9C3HUrDnyosN3MlHEcv5g5lXJeTBzpZTyTumpkHT4wi//7IngzDH3tucXeN6Xfk6JgFKXQ0g5kPN/ayclpTJq1FLefPM3/P2F1h1bUqeOIECNGhGXdJhOJopZwOMiMh1oBcRp/YRSyitkpEPSkfO/+HNKBElHyaUg5HziD6UuO//LP6dEEBoFUvB7jObO3cFjj81h9+5TADz8cAuiokLzeZX7PJYoROQLoANQXkRigReBQABjzGRgDtAVa2D1JOBBT8WilFIAmAzryz2zuCe3q4Ckw9a6+RE/CKuU85d/1vPKEFoB/PwL/XD2749n0KD5zJixGYAmTSoxeXI32rS5Ip9XFown73q6O5/lBnjMU/tXSpUgxsCZ4xeW+2dPBEmHICPNvW2GVTz3Sz+3RBBWEfycK5h57LE5fPfdNsLCAhk5sgNPPtmagIDCb/VQ7MajUEqVIMZAyqncbwPNnHf6IKSfdW+bIVEuX/q5JIJSlcA/yLPHdpHS0jKyksEbb9xEYKA/b73ViWrVynpsn5oolFJFzxg4m5DzbaDnVQQfgLRk97YZHJF3BXDpy616goAQzx6bh8TFJTNixE9s336CefP6ICLUr1+er7++y+P71kShlCpcOTYGyyEJpJ52b3tB4XlXAGc+Dwzz7HE5xBjD119vZtCgeRw8mIi/v7B27SGaN7+0RnQFoYlCKeWeXBuDZUsEbjcGC8u7AjjzMSjcs8flxf766wSPPz6XefN2AtCmTVUmT+5OkyaVijQOTRRKlXR5NQZzrQO42MZgFzy3rwSCylzQFkCdM2bMbzz//GKSk9OIiAjhjTdu4p//vAo/v6I/Z5oolPJV7jQGSzwAycfd255fYN4VwJnPgyM0ARSCpKRUkpPT6Nu3CWPGdKJixVKOxaKJQqniJiPNagyW122gBW4MVvnCX/zZE0Fo5EU1BlPuOXr0NNu2Hefaa63+7IYNa0uHDjVo1666w5FpolDKe2Q2Bsup4veiG4NdlkcFsP0YWt4jjcGUezIyDFOmrOHppxcQEODH1q2PExkZSnBwgFckCdBEoZTnZW8MllsiKHBjsHzuBHK4MZjK38aNR+jffzbLllkdaXfsWIukpFQiIwuv+43CoO8ipS5Wjo3BcigOuujGYLncCVTqMvAP9OyxKY86ffosI0f+zNixy0lLy6BSpVK8/XYXevVqhHhh/Y4mCqWyy7UxWA5XAxfbGCynO4FKVYaAYM8em/IKd975NfPm7UQEBgyI4dVXbyQiwnsbAmqiUCVLbo3BXH/9F6gxWJmcy/2zFwcFeldRgnLWsGFtOXw4kUmTutGqVVWnw8mXJgrlG/JrDJZ5JVCQxmDhVeyintwSQWUIKu3Z41LFXlpaBu+++wd79pzinXduBqBDhxqsWtXPkTYRF0MThfJu7jQGSzxg1RW4IyDE5Ze+awvgbIkgKFzbAqhLtmLFfh55ZDZr1x4CoF+/FjRqVBGg2CQJ0EShnJKeCqcP5X8VUODGYLl1BaGNwVTROXUqmWefXcTkyaswBqpXL8uECV2zkkRxo4lCFS6PNwZz+dLPqgS+3B4ZTBOAct706RsZNGgehw+fJiDAj6eeasPzz7ejVCnv7LbcHZoolHvOawyWy22gl9oYLKc6gLAK2hpYFSs//vgXhw+fpm3bK5g0qRtXXlm0Hfh5giaKki7HxmA5DA7jdmMwsYeGzOsqILMxmLYGVsVfSkoa+/cnUKtWOQBGj+7IdddV4/77mxWreoi8aKLwVgn7Yfcc3CqecYcxkHziwnYABWkMFlreZQSwXBJBWCVtDKZKjJ9+2s2jj/6An5+wbl1/goL8KV8+jAcfbO50aIVKE4U3SoiFz5rDmWNFs7+Qcjk0/sp2FRB2mTYGU8p2+HAi//73AqZNWw9AgwbliY2Nz7qq8DWaKLxNeirM7mUliYpXQaUWhbftkHIX9gyqjcGUcltGhuHDD1fzzDOLOHUqmZCQAEaMuI6hQ9sSFOS7RamaKLzNL8PhwG9Qugr0nGdV5iqlvMLtt3/JrFnbAOjcuTYTJ3aldu1Ih6PyPL2dxJvs/A5Wv2X1+Nn9K00SSnmZO+5owGWXlebLL+9k7tw+JSJJgF5ReI9Tu2De/dbz696AKtc4G49SilmzthEbG8+AAVcDcN99TbnjjmjCw0tWfZ0mCm+Qlgzf3wUpcVDnNmgx2OmIlCrR9u6N44kn5vLdd9sIDvanS5c61KpVDhEpcUkCNFF4hyWD4cifULYWdP5EWxgr5ZDU1HTGj/+DF19cwunTqYSHBzFq1A1Ur17W6dAcpYnCaVs+h3WTwT8YbvkaQiKcjkipEmn58lgeeWQ269cfBuCuuxoyblxnqlQp43BkztNE4aTjW2BBP+v59e9ApaucjUepEuz55xezfv1hataMYMKErnTtWtfpkLyGJgqnpJ6G7++0HqP7QJN+TkekVIlijCEh4Sxlylh1DhMm3Mynn67juefaERamvQu40ttjnWAMLHwUjm+GyGi4abLWSyhVhLZtO8ZNN33GHXd8iTFWNzn165fn1Vdv1CSRA72icMKGj2DzZ9YoarfO0FHSlCoiyclpvPbaL7z++jLOnk0nKiqUPXtOUbOmb3a9UVg0URS1I2vhp4HW847vQ1RDZ+NRqoRYsOAvBgyYw86dJwB46KFmjB7dkaioMIcj834eLXoSkS4isk1EdorIMzksryYii0VkjYisF5GunozHK6x8E9JT4Mp/QsN7nY5GKZ9njOGhh76jU6dp7Nx5goYNK7B06QN8/HEPTRJu8tgVhYj4AxOBjkAssFJEZhljNrusNgL4yhgzSUQaAnOAGp6KySukJlqPtbo7G4dSJYSIUKNGBKGhAbzwQnuGDGnj0x34eYIni55aAjuNMbsARGQ60ANwTRQGyLxJuSxwwIPxKKVKiLVrD3HwYAI332zd4jpsWFv69m2idREXyZNFT1WAfS7TsfY8Vy8B94pILNbVxMCcNiQi/URklYisOnr0qCdiVUr5gISEFIYMmU+LFh9w//3fcuLEGQCCgwM0SVwCTyaKnO73zD5c293AVGNMVaAr8JnIhQMkG2M+MMbEGGNiKlTQHlWVUuczxjBz5hYaNnyPceOWA3DPPVcSGKgtAAqDJ4ueYoErXKarcmHR0sNAFwBjzO8iEgKUB454MC6llA/5++9TPP74XGbP3g5ATMzlvP9+d666qrLDkfkOT6bblUBdEakpIkFAb2BWtnX2AjcCiEg0EAJo2ZJSyi3GGHr2/IrZs7dTpkwwEybczPLlD2uSKGQeu6IwxqSJyOPAfMAfmGKM2SQiI4FVxphZwFPAhyIyGKtY6gGT2UxSKaVykZFh8PMTRIQxYzoxefIqxo3rTOXK4U6H5pM82uDOGDMHq5Ladd4LLs83A209GYNSynccP57EM88sBODDD28FoEOHGnToUMPBqHyf1vQopbyeMYb/+7+1NGgwkY8+WsOnn64nNjbe6bBKDO3CQynl1bZsOcqjj/7Azz//DVhXEJMmdaNqVR0noqhoolBKeSVjDC+8sJg33lhGamoG5cuH8dZbnejbtwmivS0XKU0USimvJCLs359AamoG//rXVbz++k1ERoY6HVaJpImiqKUmWY9+euqVyu7AgQSOHUuiSZNKAIwe3ZGHH25O27bVHI6sZNPK7KJ2bIP1GNnA2TiU8iLp6RlMmLCC6OiJ9O49g7Nn0wEoXz5Mk4QX0J+1RSnxICQdhqAyULam09Eo5RX+/PMgjzwym1WrrI4b2rWrTnx8CuXLaxfg3sKtRGG3rK5mjNnp4Xh829G11mPFZnBhl1ZKlSjx8Sk8//xPTJiwkowMQ9WqZRg/vgu33dZAK6u9TL6JQkS6AWOBIKCmiDQDXjTG3O7p4HzOkTXWY8XmzsahlMOMMbRr9wnr1h3G318YMqQ1L73UgfDwYKdDUzlw52ftSKAVcArAGLMWqOPJoHxWZqKo0MzZOJRymIgweHBrWraswqpV/Xjrrc6aJLyYO0VPqcaYU9kuBbU/potxJLPoSa8oVMly9mw6Y8f+jr+/MHSo1WvPffc15d57m+Dvr8Ww3s6dRLFFRP4B+IlITeBJYLlnw/JBKfFwaif4B0FUtNPRKFVkfvnlb/r3/4HNm48SHOzPffc1pVKl0ogI/v5aF1EcuJPKHwdaABnA/4BkrGShCuLoOusxqpGVLJTycceOJfHQQ9/Rrt1UNm8+St26kcyefQ+VKpV2OjRVQO5cUXQ2xgwDhmXOEJE7sJKGcpcWO6kSwhjD1KlrGTp0AcePnyEoyJ/hw6/lmWeuJSRE78gvjty5ohiRw7znCjsQn6d3PKkSZNq0DRw/foYbbqjJ+vX9eemlDpokirFc/3Mi0hlrmNIqIjLWZVEZrGIoVRB6x5PyYUlJqcTFJVO5cjgiwnvvdWXlygP06XOltonwAXml+CPARqw6iU0u8xOAZzwZlM9JPwvHNwECFZs6HY1ShWru3B089tgcatUqx4IFfRER6tcvT/365Z0OTRWSXBOFMWYNsEZE/muMSS7CmHzP8c2QkQrl6kKQDtWofMP+/fEMGjSfGTM2AxAeHszx42e06w0f5E6hYRUReRVoCIRkzjTG1PNYVL5Gi52UD0lPz2DixJWMGPETCQlnKVUqkJEjr+eJJ1oREKBtInyRO4liKjAKGAPcDDyI1lEUjN7xpHxERoahffupLFu2D4DbbmvAO+90oVq1sg5HpjzJnfQfZoyZD2CM+csYMwK43rNh+Ri940n5CD8/oVOn2lxxRRm++643M2f20iRRArhzRZEi1m0Lf4lIf2A/UNGzYfkQk+HSa6wmClW8GGP46qtNBAT40bNnQwCGDWvLkCFtKF1aG46WFO4kisFAaeAJ4FWgLPCQJ4PyKad2wdkEKHUZlKrkdDRKue2vv04wYMAcfvzxLypUCOOGG2pSrlwowcEBBGv/fSVKvonCGPOH/TQB6AsgIlU9GZRP0asJVcykpKTx5pu/8eqrv5CcnEa5ciG8+uoNlC0bkv+LlU/KM1GIyNVAFeBXY8wxEWmE1ZXHDYAmC3do/YQqRpYs2cOjj/7A1q3HAOjbtwljxnSiYsVSDkemnJRrZbaIvAb8F+gDzBOR54DFwDpAb411l94aq4qJ9PQMBgywkkT9+lH89NN9fPrp7ZokVJ5XFD2ApsaYMyISCRywp7cVTWg+Qm+NVV4sI8OQnJxGWFgg/v5+TJrUjaVL/+bpp9sSHKx9MylLXu+EZGPMGQBjzAkR2apJooBOH4bTB63W2BG1nI5GqfNs2HCY/v1/oEGDKD7+uAcA7dvXoH37Gs4GprxOXomilohkdiUuQA2XaYwxd3g0Ml+QVezUFERbrCrvcPr0WUaO/JmxY5eTlpbB7t0nOXnyDOXKhTodmvJSeSWKntmmJ3gyEJ+kxU7Ky3z//TYef3wue/fGIQIDBsTw6qs3EhGhdzSp3OXVKeCiogzEJ+kdT8pLpKVl0KvXDP73vy0ANGt2Ge+/352WLas4HJkqDrS2ypOO6h1PyjsEBPhRtmwwpUsH8cor1/P44y21Az/lNo++U0Ski4hsE5GdIpLjGBYi8g8R2Swim0Tkc0/GU6TOJsDJneAXCOUbOR2NKoH++COWP/6IzZp+882ObNnyGIMGtdYkoQrE7SsKEQk2xqQUYH1/YCLQEYgFVorILGPMZpd16gLDgbbGmJMi4jt9SB1dDxiIagT+2ieOKjqnTiUzfPhC3n9/NQ0alGft2v4EBfkTFaXjRKiLk+/PChFpKSIbgB32dFMRedeNbbcEdhpjdhljzgLTsdpmuPoXMNEYcxLAGHOkQNF7M62fUEXMGMPnn2+gQYMJTJ68Gn9/P269tT7p6ToqgLo07lxRjAe6A98CGGPWiYg73YxXAfa5TMcCrbKtUw9ARJYB/sBLxph5bmzb+2Xd8aT1E8rzduw4zoABc1i4cBcAbdteweTJ3Wnc2Hcu0pVz3EkUfsaYv7MNkJ7uxutyGlHd5LD/ukAHrL6jfhGRxsaYU+dtSKQf0A+gWrVqbuzaC+gVhSoiqanp3HDDp8TGxhMZGcro0Tfx4IPN8fPL6SOoVMG5kyj2iUhLwNj1DgOB7W68Lha4wmW6KlY3INnXWW6MSQV2i8g2rMSx0nUlY8wHwAcAMTEx2ZON90lPheMbrecVmjobi/JZxhhEhMBAf1599QYWL97D6NE3UaGC9s2kCpc7tz48CgwBqgGHgdb2vPysBOqKSE0RCQJ6A7OyrfMt9mh5IlIeqyhql3uhe7HjmyH9LETUhuAyTkejfMzhw4n07TuTUaOWZs27776mfPJJD00SyiPcuaJIM8b0LuiGjTFpIvI4MB+r/mGKMWaTiIwEVhljZtnLOonIZqzirKHGmOMF3ZfX0TEolAdkZBg+/HA1zzyziFOnkomICGHQoNaEh+soQsqz3EkUK+0ioS+B/xljEtzduDFmDjAn27wXXJ4brKuVIe5us1jQ+glVyNatO0T//j+wfLnVLqJLlzpMnNhVk4QqEu6McFdbRK7BKjp6WUTWAtONMdM9Hl1xpWNQqEKSmprO8OGLePvt5aSnGypXLs0773Thzjsbku0GE6U8xq3mmcaY34wxTwBXAfFYAxqpnBijnQGqQhMQ4MeaNYfIyDAMHNiSLVse4667GmmSUEUq3ysKESmN1VCuNxANfAdc4+G4iq+43XA2HsIqQenKTkejiqG9e+NIT8+gZs1yiAiTJ3cjLi6FmJjLnQ5NlVDu1FFsBL4HRhtjfvFwPMWf1k+oi5Sams477/zBiy8uoU2bqixY0BcRoW7dKKdDUyWcO4miljFG+wBw11Ftka0K7vff99G//w+sX38YgMjIUJKSUilVSvsJU87LNVGIyFvGmKeAb0TkgkZuOsJdLvSKQhXAyZNneOaZhXzwwZ8A1KwZwcSJXbn55roOR6bUOXldUXxpP+rIdgWhiUK5KSUljWbN3mfv3jgCA/0YOvQannuuHWFhgU6HptR58hrhbgCNSvoAACAASURBVIX9NNoYc16ysBvS6Qh42SUdgcQDEFjaapWtVB6CgwN4+OHmLFq0m0mTutGwYQWnQ1IqR+7cHvtQDvMeLuxAfELmbbEVmoLowDDqfMnJabz44mI+/3xD1rxnn72OJUvu1yShvFpedRS9sG6JrSki/3NZFA6cyvlVJZwWO6lcLFjwFwMGzGHnzhNUrFiK229vQGhooI40p4qFvOooVgDHsXp9negyPwFY48mgiq2sRKF3PCnLoUOJDBkyny++sHoTbtSoApMndyc0VOshVPGRVx3FbmA3sLDowinmtEW2sqWnZ/D++6t59tlFxMWlEBoawIsvtmfw4DYEBfk7HZ5SBZJX0dPPxpj2InKS8wccEqz+/CI9Hl1xcjYRTm4HvwBrnGxVoqWnG959dwVxcSl07VqXCRNupmbNck6HpdRFyavoKXO40/JFEUixd3Q9YCCqIQRoj54lUUJCCunphoiIEIKC/Pnww1s4fDiRO+6I1r6ZVLGWa02aS2vsKwB/Y0w60AZ4BNDRUbLTMShKLGMM//vfFqKjJ/LUU/Oz5l97bTV69tReXlXx584tF99iDYNaG/gUq2PAzz0aVXG02x5247KWzsahitSePae49dbp9Oz5Ffv3J7Bx41GSk9OcDkupQuVOosiwx7S+A3jbGDMQqOLZsIqZxAOwe65VP1HvLqejUUUgNTWdN974lYYNJzJ79nbKlAlmwoSb+e23hwgJcacLNaWKD7eGQhWRu4C+wG32PL23z9Xmz8BkQO0eEKYNp3xdUlIqrVt/xIYNRwDo3bsxY8d2onLlcIcjU8oz3EkUDwEDsLoZ3yUiNYEvPBtWMWIMbPzEet74QWdjUUUiLCyQmJjLSUpK5b33utGpk3bXonybWMNW57OSSABQx57caYxxrBA2JibGrFq1yqndX2j/bzC9LZS6DPrts4qflE8xxvDpp+uoXTuSa6+tBkBcXDJBQf7acE4VGyKy2hgTczGvdWeEu+uAz4D9WG0oLhORvsaYZRezQ5+zyb6aiO6rScIHbdlylEcf/YGff/6b6OjyrF3bn6Agf8qWDXE6NKWKjDvfbOOArsaYzQAiEo2VOC4qM/mU1NOwze6NXYudfMqZM6m8+uovjB69jNTUDCpUCGP48GsJDNS+mVTJ406iCMpMEgDGmC0iosNuAWz/Bs4mQOXWEBXtdDSqkMybt5PHHpvDrl0nAfjXv67i9ddvIjIy1OHIlHKGO4niTxF5H+sqAqAP2imgZZNWYvuaxMSz9O07k2PHkmjcuCKTJ3ejbdtqToellKPcSRT9gSeAp7HqKJYC73oyqGLh1C7YtwQCQqF+L6ejUZcgPT2DjAxDYKA/pUsH8c47XYiNjWfw4NYEBmoHfkrlmShE5EqgNjDTGDO6aEIqJjZNtR7r9oTgso6Goi7e6tUHeOSR2fToUZ/nn28PwD33XOlwVEp5l1xr5kTkWazuO/oAC0Qkp5HuSqaM9HOJQoudiqX4+BSefHIuLVt+xOrVB/nss/WkpqY7HZZSXimvK4o+QBNjzGkRqQDMAaYUTVhebu9PkLAPytSAKzo4HY0qAGMMM2Zs5skn53HwYCL+/sKQIa15+eXrtZhJqVzklShSjDGnAYwxR0V0EOgsmZXYjR7QsbGLkYSEFHr1msHcuTsBaNWqCpMnd6dZs8scjkwp75ZXoqjlMla2ALVdx842xtzh0ci8VfJJ2PE/QKDxA05HowqgdOkgUlLSKVs2mNdfv4l+/Vrg56ddgCuVn7wSRc9s0xM8GUixsXU6pKdAtRuhTHWno1H5WLr0bypXLk3dulGICFOm3EpISACVKpV2OjSlio28xsxeVJSBFBvadqJYOHYsiaefXsAnn6zlxhtrsmBBX0SE6tUjnA5NqWJHOycqiGMb4dBK63bYOiWz5M3bZWQYpk5dy9ChCzhx4gxBQf5cd1010tMNAQFazKTUxfBoTayIdBGRbSKyU0SeyWO9O0XEiIh39x+V2Z14/d4QqN05eJtNm47QocNUHn54FidOnOHGG2uyYcOjvPhiBwIC9KYDpS6W21cUIhJsjEkpwPr+wESgIxALrBSRWa79RtnrhWO1/P7D3W07Ij3VGqAItNjJC8XFJdO69cckJp6lYsVSjB3biXvuuVLHq1aqEOT7M0tEWorIBmCHPd1URNzpwqMl1tgVu4wxZ4HpQI8c1nsFGA0kux+2A3b9AGeOQlRDHRfbi2SOp1K2bAjDhrWlf/8WbN36GH36NNEkoVQhced6fDzQHTgOYIxZB1zvxuuqAPtcpmPJNta2iDQHrjDGzM5rQyLST0RWiciqo0ePurFrD8hqO/Eg6BeQ4/bvj+fOO79i2rT1WfOee+46Jk3qTrlyWiyoVGFyJ1H4GWP+zjbPnb4Ocvo2zRpOz27ANw54Kr8NGWM+MMbEGGNiKlRwYEzq04esKwrxh4Z9i37/KktaWgbvvLOcBg0m8s03W3jxxSWkp2cA6BWEUh7iTh3FPhFpCRi73mEgsN2N18UCV7hMVwUOuEyHA42BJfYH/DJglojcaozxorFOgc3TwKRD7VuhVCWnoymxVq7cT//+P/DnnwcBuO22Bowf3wV/f62oVsqT3EkUj2IVP1UDDgML7Xn5WQnUFZGaWMOo9gbuyVxojIkDymdOi8gS4N9elySMOb/YSRW506fPMmzYQt57byXGQLVqZXn33Zu59db6ToemVImQb6IwxhzB+pIvEGNMmog8DswH/IEpxphNIjISWGWMmVXgaJ1waAUc3wxhFaFWN6ejKZECAvxYuHAXfn7CkCFtePHF9pQqpYMsKlVU8k0UIvIhLnULmYwx/fJ7rTFmDlavs67zXshl3Q75bc8RmW0nou8F/0BnYylB/vrrBBERIURFhREcHMBnn91OSEgAV16pRX9KFTV3CncXAovsv2VARcDt9hTFWmoSbP3Ceq5tJ4pESkoao0YtpXHjSQwbtjBr/tVXV9EkoZRD3Cl6+tJ1WkQ+AxZ4LCJvsnMmnI2Hy66G8o2djsbnLVmyh0cf/YGtW48B1h1O6ekZWlmtlMMupq+nmkDJ6DZ1o1ZiF4UjR04zdOgCPv10HQD160cxaVI3rr++psORKaXAvTqKk5yro/ADTgC59tvkM+L2WCPZBYRAg7udjsZnHTuWRHT0RE6cOENwsD/PPXcdTz/dluBg7a9SKW+R56dRrAYOTbFubwXIMJl9Jvi6Tf8HGKhzO4Ro19SeUr58GD161Cc2Np733utGnTqRToeklMomz0RhjDEiMtMY06KoAvIKJgM2TbWea7FToTp9+iwjR/5Mt271aNfOKsF8771uBAf7a8tqpbyUO7WEK0TkKo9H4k32LYH4PRBeDard4HQ0PuP777fRsOF7jB79GwMG/EBGhnVxGhISoElCKS+W6xWFiAQYY9KAa4F/ichfwGmsPpyMMcZ3k0dWJfb94OfvbCw+YN++OJ58ch4zZ24FoHnzy3j//e46XrVSxUReRU8rgKuA24ooFu+QEgc7vrGeN3rA0VCKu7S0DMaP/4MXXljM6dOplC4dxKhR1/PYYy11ICGlipG8EoUAGGP+KqJYvMO2LyHtDFzRASJqOR1NsRYfn8Jrr/3K6dOp9OwZzdtvd6Fq1TJOh6WUKqC8EkUFERmS20JjzFgPxOM8bTtxSU6dSiY0NIDg4AAiI0N5//3uBAf7061bPadDU0pdpLyu//2B0ljdgef053uOb4GDyyEoHOr1dDqaYsUYw+efb6B+/QmMHr0sa/4dd0RrklCqmMvriuKgMWZkkUXiDTKvJur3gsBSzsZSjGzffpwBA35g0aLdACxduhdjjN7JpJSPyLeOosRIT4XNn1rPtdjJLcnJabzxxq/85z+/cvZsOpGRobz5ZkceeKCZJgmlfEheieLGIovCG+yZB0mHoVx9uLyN09F4vUOHEmnX7hN27DgBwAMPNOPNNztSvnyYw5EppQpbronCGHOiKANxXGaxU+MHQX8N56tSpVJccUVZAgL8mDSpG+3b13A6JKWUh2jPawBJR2HX9yD+0PA+p6PxShkZhg8/XM3119ekXr0oRITPP7+DcuVCCQrSRolK+TJt9QSwZRpkpEHNLlC6stPReJ116w7Rtu0U+vf/gQEDfiCzX8hKlUprklCqBNArCmO07UQuEhPP8tJLS3j77eWkpxsuvzyc/v1jnA5LKVXENFEcXg3HNkBoeah9i9PReI1vv93KwIFziY2Nx89PGDiwJaNG3UCZMsFOh6aUKmKaKDKvJqL7gH+Qs7F4if374+ndewYpKem0aFGZyZO7ExNzudNhKaUcUrITRVoybP3cel7Ci51SU9MJCPBDRKhSpQyvvnoDQUH+DBhwtY5ZrVQJV7K/AXZ+CymnoOJVULGp09E45rff9tGixQdMm7Y+a95TT13DwIGtNEkopUp4onBtO1ECnThxhkce+Z62baewYcMR3ntvFSVlpFullPtKbtFT/F74e4FVL9HgHqejKVLGGKZNW89TT/3I0aNJBAb68fTTbXnuueu06w2l1AVKbqLY/ClgoPZtEBrpdDRF5vDhRO6++xsWL94DQPv21Zk0qRvR0RWcDUwp5bVKZqIwGSW22CkiIoSDBxMpXz6MMWM6ct99TfUqQimVp5KZKGJ/gbhdULoKVO/odDQet2DBX1x1VWWiosIIDg7g66/vonLl0kRFaQd+Sqn8lczK7E2ZLbHvBz/f7YLi4MEE7r77Gzp1msawYQuz5jduXFGThFLKbSXviuJsAmz72nruo20n0tMzeP/91Qwfvoj4+BRCQwOoXz9KBxNSSl2Ukpcotn0FaUlQ5TooV8fpaArdn38epH//2axceQCAbt3qMmFCV2rUiHA4MqVUcVXyEoUPV2Lv2XOKli0/JD3dUKVKOOPH38zttzfQqwil1CXxaKIQkS7AO4A/8JEx5vVsy4cA/wTSgKPAQ8aYvz0W0IltcGCZNR52vbs8thun1KgRwYMPNiM8PJiXX+5AeLh24KeUunQeq8wWEX9gInAz0BC4W0QaZlttDRBjjGkCzABGeyoeADZNtR7r/QOCSnt0V0Vhz55T3HLLF/z8856seR98cAtjx3bWJKGUKjSevKJoCew0xuwCEJHpQA9gc+YKxpjFLusvB+71WDQZaXYjO4p9sVNqajpjx/7Oyy//zJkzaRw7lsTvvz8MoMVMSqlC58lEUQXY5zIdC7TKY/2Hgbk5LRCRfkA/gGrVql1cNHt+hMQDEFEHqlx7cdvwAr/+upf+/WezadNRAHr3bszYsZ0cjkop5cs8mShy+mmbY49zInIvEAO0z2m5MeYD4AOAmJiYi+u1bpNLJXYx/NV98uQZhg5dwMcfrwGgdu1yvPdeNzp1qu1wZEopX+fJRBELXOEyXRU4kH0lEbkJeA5ob4xJ8UgkScdg53cgftDwPo/swtMyMgzffbeNwEA/nnnmWoYPv5bQ0ECnw1JKlQCeTBQrgboiUhPYD/QGzuumVUSaA+8DXYwxRzwWydbPISMVanSB8Koe201h27r1GDVrRhAcHEBUVBj//e8dVKtWlgYNyjsdmlKqBPHYXU/GmDTgcWA+sAX4yhizSURGisit9mpvAqWBr0VkrYjM8kgwxaztRFJSKs89t4gmTSYxevSyrPmdOtXWJKGUKnIebUdhjJkDzMk27wWX5zd5cv8AHF4DR9dCSCTU7uHx3V2qefN2MmDAD+zefQqAY8eSHI5IKVXS+X7L7MxK7Ab3QID3ti04cCCBQYPm8fXX1t3DV15ZkcmTu3PNNVfk80qllPIs304UaSmw5b/W88YPORtLHrZvP05MzAckJJwlLCyQl15qz6BBrQkM9N2ebZVSxYdvJ4q/ZkHyCajQFCo1dzqaXNWtG8nVV1ehVKlA3n33ZqpX1w78lFLew7cTxSbvrMSOj0/hhRcWM2DA1dSrF4WIMGtWb0qVCnI6NKWUuoDvJoqE/bBnPvgFQoM+TkcDgDGGGTM28+ST8zh4MJGtW48xb57Va4kmCaWUt/LdRLH5U2ts7Dq3Q5jzt5Tu2nWSxx+fw9y5OwFo3boqb7zh+Zu+lFLqUvlmojDGa4qdzp5NZ8yY33jllaUkJ6cRERHC66/fyL/+1QI/v+LXlYhSquTxzUSxfxmc3AGlKkONzo6Gsm9fHCNH/kxKSjp9+lzJW291olKl4t/FuVKq5PDNRJF5NdHwPvAr+kM8efIMEREhiAi1a0fyzjtdqFMnkhtvrFXksSil1KXyWBcejjmbaI2LDUVe7JSRYZgyZQ116rzLtGnrs+Y/8kiMJgmlVLHle4li+wxITYTLr4HI+kW2202bjtChw1QefngWJ06cyaq0Vkqp4s73ip4yi50aFc3VRFJSKq+88jNjxvxOWloGFSuWYty4ztx9d+Mi2b9SSnmabyWKkzshdikEhEH9f3h8d9u3H6dz52ns2XMKEejfvwX/+c+NlCsX6vF9K6VUUfGtRLFpqvVY704ILuPx3VWvXpaQkACaNq3E5Mndad26+Ix1oTwvNTWV2NhYkpOTnQ5FlSAhISFUrVqVwMDCG9jMdxJFRjps+j/ruYcqsdPSMpg8eRV3392YqKgwgoMDmDevD1WqlCEgwPeqe9SliY2NJTw8nBo1aiDFcPhdVfwYYzh+/DixsbHUrFmz0LbrO99uexdCYiyUrQVV2xX65les2E/Llh8ycOBchg1bmDW/evUITRIqR8nJyURFRWmSUEVGRIiKiir0q1jfuaLIHMWu0QPW2NiFJC4umeee+4n33luJMVCtWll69Ci6u6lU8aZJQhU1T7znfCNRnDkBO2cCAo3uL5RNGmP48stNDB48n0OHEgkI8GPIkNa88EJ77cBPKVWi+EaZydYvIP0sVL8JylQrlE2uW3eYu+/+hkOHErnmmiv4889+vPFGR00Sqljx9/enWbNmNG7cmFtuuYVTp05lLdu0aRM33HAD9erVo27durzyyisYY7KWz507l5iYGKKjo2nQoAH//ve/nTiEPK1Zs4Z//vOfToeRp9dee406depQv3595s+fn+M6ixYt4qqrrqJZs2Zce+217Nx5fjusGTNmICKsWrUKgA0bNvDAAw94OvRzjDHF6q9FixbmAp+1MGYMxmz+/MJlBZCWln7e9ODB88yHH6426ekZl7RdVTJt3rzZ6RBMqVKlsp7fd999ZtSoUcYYY5KSkkytWrXM/PnzjTHGnD592nTp0sVMmDDBGGPMhg0bTK1atcyWLVuMMcakpqaaiRMnFmpsqampl7yNO++806xdu7ZI91kQmzZtMk2aNDHJyclm165dplatWiYtLe2C9erWrZv1fpk4caK5//77s5bFx8eb6667zrRq1cqsXLkya/6NN95o/v777xz3m9N7D1hlLvJ7t/gXPR1dD4dXQ3AE1LntojezePFuBgyYw/vvd6ddu+oAjB3rbIeCyoe85aG6iqdM/uvY2rRpw/r1Vtcyn3/+OW3btqVTp04AhIWFMWHCBDp06MBjjz3G6NGjee6552jQoAEAAQEBDBgw4IJtJiYmMnDgQFatWoWI8OKLL9KzZ09Kly5NYmIiYP0anj17NlOnTuWBBx4gMjKSNWvW0KxZM2bOnMnatWuJiLBGdaxTpw7Lli3Dz8+P/v37s3fvXgDefvtt2rZte96+ExISWL9+PU2bNgVgxYoVDBo0iDNnzhAaGsonn3xC/fr1mTp1Kj/88APJycmcPn2an376iTfffJOvvvqKlJQUbr/9dl5++WUAbrvtNvbt20dycjJPPvkk/fr1c/v85uS7776jd+/eBAcHU7NmTerUqcOKFSto06bNeeuJCPHx8QDExcVx+eWXZy17/vnnefrppxkzZsx5r7nllluYPn06Tz/99CXF6I7inygyK7Eb3A2BBW/oduTIaYYOXcCnn64DYOzY37MShVK+Ij09nUWLFvHwww8DVrFTixYtzlundu3aJCYmEh8fz8aNG3nqqafy3e4rr7xC2bJl2bBhAwAnT57M9zXbt29n4cKF+Pv7k5GRwcyZM3nwwQf5448/qFGjBpUqVeKee+5h8ODBXHvttezdu5fOnTuzZcuW87az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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_score = classifier.fit(X_train, y_train).predict_proba(X_test)\n",
    "\n",
    "# Compute ROC curve and ROC area for each class\n",
    "fpr = dict()\n",
    "tpr = dict()\n",
    "roc_auc = dict()\n",
    "for i in range(n_classes):\n",
    "    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])\n",
    "    roc_auc[i] = auc(fpr[i], tpr[i])\n",
    "\n",
    "# Compute micro-average ROC curve and ROC area\n",
    "fpr[\"micro\"], tpr[\"micro\"], _ = roc_curve(y_test.ravel(), y_score.ravel())\n",
    "roc_auc[\"micro\"] = auc(fpr[\"micro\"], tpr[\"micro\"])\n",
    "\n",
    "plt.figure()\n",
    "lw = 2\n",
    "plt.plot(fpr[2], tpr[2], color='darkorange',\n",
    "         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])\n",
    "plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
    "plt.xlim([0.0, 1.0])\n",
    "plt.ylim([0.0, 1.05])\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('Receiver operating characteristic example')\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Using `decision_function()`**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEWCAYAAAB42tAoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdd3gU1frA8e+bnkAgJBQRpLcAUiRSRAELRUBR0QsWbNyriA3wIqLYEK+ICIog2JCL/BQVL4pIERBEUaRI7wgIodcUQkLK+f0xk7CElA1kM9nN+3mePNkpO/POZLPvzDlzzhFjDEoppVRu/JwOQCmlVPGmiUIppVSeNFEopZTKkyYKpZRSedJEoZRSKk+aKJRSSuVJE4UPEJF7ReRHp+NwmohUE5FEEfEvwn3WEBEjIgFFtU9PEpFNItLhIt7ns59BEekgIrFOx+EkTRSFTET2iMgZ+wvrkIhMEZHSntynMeb/jDGdPLmP4sg+1zdlThtj9hpjShtj0p2Myyl2wqpzKdswxjQyxizJZz8XJMeS+hksKTRReMYtxpjSQDOgOTDU4XguipNXyb5yhV4Qer5VcaWJwoOMMYeA+VgJAwARCRaR0SKyV0QOi8gkEQl1Wd5DRNaKSLyI/CUiXez5ZUXkExE5KCL7RWREZhGLiDwoIr/aryeJyGjXOETkOxEZZL++XES+EZGjIrJbRJ5yWe8VEZkhItNEJB54MPsx2XFMtd//t4gMExE/lziWich7IhInIltF5MZs783rGJaJyFgROQG8IiK1ReQnETkuIsdE5P9EJMJe/zOgGvC9fff2bPYrXRFZIiKv2dtNEJEfRaS8Szz328dwXERezH6Hku24Q0XkbXv9OBH51fXvBtxr/02PicgLLu9rKSK/i8gp+7jHi0iQy3IjIo+LyA5ghz3vXRHZZ38GVovIdS7r+4vI8/ZnI8FefoWILLVXWWefj172+t3tz9MpEflNRJq4bGuPiAwRkfXAaREJcD0Hduyr7DgOi8gY+62Z+zpl76uN62fQfm8jEVkgIifs9z6fy3nN9f/Bjm25y9/zMbGKxkLs6a/FumuPE5GlItLIZbtTROR9EZlrx7hMRC4TkXdE5KT92Wye7VwMFZHN9vJPM/eTQ8y5/g/5LGOM/hTiD7AHuMl+XRXYALzrsvwdYBYQCYQD3wNv2MtaAnFAR6wkXgVoYC/7FvgAKAVUBFYAj9rLHgR+tV+3A/YBYk+XA84Al9vbXA28BAQBtYBdQGd73VeAVOA2e93QHI5vKvCdHXsNYDvQ1yWONGAgEAj0so8n0s1jSAOeBAKAUKCOfS6CgQpYX1Dv5HSu7ekagAEC7OklwF9APXt7S4CR9rKGQCJwrX0uRtvHflMuf9cJ9vurAP7ANXZcmfv8yN5HUyAFiLbf1wJobR9TDWALMMBluwZYgPV5CLXn3QdE2e95BjgEhNjLBmN9puoDYu8vymVbdVy2fRVwBGhlx/yAfc6CXc7fWuAKl31nnVPgd6CP/bo00Dqn85zDZzAcOGjHHmJPt8rlvOb1/+Bn/81fAeoCJ4HmLu992H5PsL2dtS7LpgDH7PMfAvwE7Abut8/FCGBxts/SRvtcRALLgBH2sg5ArEtMuf4P+eqP4wH42o/9gUsEEux/pkVAhL1MgNNAbZf12wC77dcfAGNz2GYlrC+fUJd5d2d+0LP9kwqwF2hnT/8L+Ml+3QrYm23bQ4FP7devAEvzODZ/O46GLvMeBZa4xHEAO0nZ81YAfdw8hr257dte5zZgTbZznV+iGOayvD8wz379EvCFy7Iw4Cw5JAr7y+EM0DSHZZn7rJrtmHvncgwDgJku0wa4IZ/jPpm5b2Ab0COX9bInionAa9nW2Qa0dzl/D+fw+c1MFEuBV4HyuRxzbonibte/Ux7Hlef/g8u+TmAl2KF5bCvCjqmsPT0F+Mhl+ZPAFpfpK4FT2Y67n8t0V+Av+3UHziWKPP+HfPVHyyU94zZjzEIRaQ98DpQHTmFdFYcBq0Ukc13B+gIG62pmTg7bq451hX7Q5X1+WHcO5zHGGBGZjvXPuhS4B5jmsp3LReSUy1v8gV9cpi/YpovyWFdRf7vM+xvrKjvTfmP/97gsv9zNYzhv3yJSERgHXId15eiH9aVZEIdcXidhXRljx5S1P2NMkogcz2Ub5bGuSv8q6H5EpB4wBojB+tsHYF2Rusp+3M8A/7RjNEAZOwawPiN5xeGqOvCAiDzpMi/I3m6O+86mLzAc2Coiu4FXjTGz3divuzHm9/+AMWaPiCzG+uKekLWSVWT5OnCXvZ0Me1F5rLtYgMMu+zqTw3T2h0xcz0Xm5zY7d/6HfI7WUXiQMeZnrCubzDqDY1gf0EbGmAj7p6yxKr7B+qDWzmFT+7Cuxsu7vK+MMaZRDusCfAHcKSLVsa6AvnHZzm6XbUQYY8KNMV1dw87jkI5hFc9Ud5lXDdjvMl1FXP7r7eUH3DyG7Pt+w57XxBhTBqtIRvJYvyAOYhUNAlYdBFZxT06OAcnk/LfJz0RgK1DXPobnOf8YwOU47PqIIcA/gHLGmAisL77M9+T2GcnJPuD1bH/vMGPMFzntOztjzA5jzN1YxYRvAjNEpFRe7ylgjPn9PyAiXbHuMhYBb7m89x6gB3ATUBbrzgMuPLcFcYXL68zPbXbu/A/5HE0UnvcO0FFEmhljMrDKssfaV8uISBUR6Wyv+wnwkIjcKCJ+9rIGxpiDwI/A2yJSxl5W275juYAxZg1wFPgYmG+Mybz6WQHE25WEoXbFaGMRudqdAzHWY6dfAa+LSLidiAZx7o4FrC+Vp0QkUETuAqKBOQU9Bls4VjHeKRGpglU+7+owVhnxxZgB3CIi14hVufwquXzJ2H+3ycAYuyLT367ADXZjP+FAPJAoIg2Ax9xYPw3r7xcgIi9h3VFk+hh4TUTqiqWJiGQmuOzn4yOgn4i0stctJSLdRCTcjbgRkftEpIJ9/JmfoXQ7tgxyP/ezgctEZIBdWR0uIq2yr5Tf/4NYDx58gnV39QDW3yvzCzkc68LjONZdyX/cOaZ8PC4iVUUkEiuhf5nDOpf0P+StNFF4mDHmKFYF8Iv2rCHATmC5WE8WLcSqmMQYswJ4CBiLdRX5M+eu3u/HKjbYjFX8MgOonMeuv8C62vrcJZZ04Basp7B2Y13RfYx1ReauJ7HKlXcBv9rbn+yy/A+sisdjWEUDdxpjMot0CnoMr2JVyMYBPwD/y7b8DWCYWE/0/LsAx4AxZpN9LNOx7i4SsCp+U3J5y7+xKpFXYpWZv4l7/z//xrr6TcD6Uszpy8fVfGAu1kMCf2PdybgWiYzBStY/YiWgT7Aq0cGqY/qvfT7+YYxZhVVHNR7rfO8khyfZ8tAF2CQiicC7WPUuycaYJKy/7TJ7X61d32SMScB6COEWrCK5HcD1uewj1/8H4EPgO2PMHPsz1Bf42E6MU+3zsx/r87S8AMeVm8+xzusu+2dE9hUK6X/I62Q+GaPUJRORB4F/GmOudTqWghKrUeQprCKi3U7Ho4qWiOzB+uwudDqW4kjvKFSJJSK3iEiYXe4+GuuOYY+zUSlV/GiiUCVZD6wKywNYxWW9jd5iK3UBLXpSSimVJ72jUEoplSeva3BXvnx5U6NGDafDUEopr7J69epjxpgKF/Ner0sUNWrUYNWqVU6HoZRSXkVE/s5/rZxp0ZNSSqk8aaJQSimVJ00USiml8qSJQimlVJ40USillMqTJgqllFJ58liiEJHJInJERDbmslxEZJyI7BSR9SJyladiUUopdfE8eUcxBaub4tzcjNW/Tl3gEawBXpRSShUGYyAlHo5v5ezOS+sU12MN7owxS0WkRh6r9ACm2p2wLReRCBGpbA9wo5RSKjeppyHxwLmf0wcg8aD9+8C536mnGfx9R9YcyGvYl/w52TK7CucPyBJrz7sgUYjII1h3HVSrVq1IglNKqSKXegZOHzz/yz7xgDXPdfpsvHvbCwilcS1h3LIalxSWk4kip2Enc+zK1hjzIdZoV8TExGh3t0op75KWAkmHcrgLOHB+Ykg+6d72/IOh9OVQ6nL7d2Xrd+nL2Xwggj93BHLfw20gqAz3A+1fiqNmzeEXHb6TiSKW8wczr0rOg5krpVTxlJ4KSYcv/PLPngjOHHNve36B533p55QIKHU5hJQDOf9aOykplREjlvLWW7/h7y+07tiSOnUEAWrUiLikw3QyUcwCnhCR6UArIE7rJ5RSxUJGOiQdOf+LP6dEkHSUXApCzif+UOqy87/8c0oEoVEgBX/GaO7cHTz++Bx27z4FQN++LYiKCs3nXe7zWKIQkS+ADkB5EYkFXgYCAYwxk4A5QFesgdWTgIc8FYtSSgFgMqwv98zintzuApIOW+vmR/wgrFLOX/5ZrytDaAXw8y/0w9m/P54BA+YzY8ZmAJo0qcSkSd1o0+aKfN5ZMJ586unufJYb4HFP7V8pVYIYA2eOX1junz0RJB2CjDT3thlW8dyVfm6JIKwi+DlXMPP443P47rtthIUFMnx4B55+ujUBAYXf6sHrxqNQSpUgxkDKqdwfA82cd/ogpJ91b5shUS5f+rkkglKVwD/Is8d2kdLSMrKSwZtv3kRgoD9vv92JatXKemyfmiiUUkXPGDibkPNjoOdVBB+AtGT3thkckXcFcOnLrXqCgBDPHpuHxMUlM2zYT2zffoJ58+5FRKhfvzxff32Xx/etiUIpVbhybAyWQxJIPe3e9oLC864AznwdGObZ43KIMYavv97MgAHzOHgwEX9/Ye3aQzRvfmmN6ApCE4VSyj25NgbLlgjcbgwWlncFcObvoHDPHlcx9tdfJ3jiibnMm7cTgDZtqjJpUneaNKlUpHFoolCqpMurMZhrHcDFNga74LV9JxBU5oK2AOqc0aN/48UXF5OcnEZERAhvvnkT//znVfj5Ff0500ShlK9ypzFY4gFIPu7e9vwC864AznwdHKEJoBAkJaWSnJxGnz5NGD26ExUrlnIsFk0USnmbjDSrMVhej4EWuDFY5Quv+LMngtDIi2oMptxz9Ohptm07zrXXWv3ZDRnSlg4datCuXXWHI9NEoVTxkdkYLKeK34tuDHZZHhXA9u/Q8h5pDKbck5FhmDx5Dc8+u4CAAD+2bn2CyMhQgoMDikWSAE0USnle9sZguSWCAjcGy+dJIIcbg6n8bdx4hH79ZrNsmdWRdseOtUhKSiUysvC63ygM+ilS6mLl2Bgsh+Kgi24MlsuTQKUuA/9Azx6b8qjTp88yfPjPjBmznLS0DCpVKsU773ShV69GSDGs39FEoVR2uTYGy+Fu4GIbg+X0JFCpyhAQ7NljU8XCnXd+zbx5OxGB/v1jeP31G4mIKL4NATVRqJIlt8Zgrlf/BWoMVibncv/sxUGBxasoQTlryJC2HD6cyMSJ3WjVqqrT4eRLE4XyDfk1Bsu8EyhIY7DwKnZRT26JoDIElfbscSmvl5aWwXvv/cGePad4992bAejQoQarVj3iSJuIi6GJQhVv7jQGSzxg1RW4IyDE5UrftQVwtkQQFK5tAdQlW7FiP48+Opu1aw8B8MgjLWjUqCKA1yQJ0EShnJKeCqcP5X8XUODGYLl1BaGNwVTROXUqmeefX8SkSaswBqpXL8v48V2zkoS30UShCpfHG4O5fOlnVQJfbo8MpglAOW/69I0MGDCPw4dPExDgxzPPtOHFF9tRqlTx7LbcHZoolHvOawyWy2Ogl9oYLKc6gLAK2hpYeZUff/yLw4dP07btFUyc2I0rryzaDvw8QRNFSZdjY7AcBodxuzGY2END5nUXkNkYTFsDK++XkpLG/v0J1KpVDoBRozpy3XXVeOCBZl5VD5EXTRTe7vgW2P9L/usZA8knLmwHUJDGYKHlXUYAyyURhFXSxmCqxPjpp9089tgP+PkJ69b1IyjIn/Llw3jooeZOh1aoNFF4s0Mr4Yu2kJF6adsJKZdD469sdwFhl2ljMKVshw8n8u9/L2DatPUANGhQntjY+Ky7Cl+jicJbnTkB399lJYkrroeIOvm/J6TchT2DamMwpdyWkWH46KPVPPfcIk6dSiYkJIBhw65j8OC2BAX5blGqJgpvZDJg3gMQ/zdcdjXcMVev9pUqArff/iWzZm0DoHPn2kyY0JXatSMdjsrz9HESb7RyNOyabd0hdP9Kk4RSReSOOxpw2WWl+fLLO5k7994SkSRA7yi8T+xS+PV563WXqVC2hqPhKOXLZs3aRmxsPP37Xw3A/fc35Y47ogkPL1kXZ5oovMnpwzC7N5h0uPpZqN3d6YiU8kl798bx1FNz+e67bQQH+9OlSx1q1SqHiJS4JAGaKLxHRjrMucd6nLXKdXDt605HpJTPSU1NZ9y4P3j55SWcPp1KeHgQI0bcQPXqZZ0OzVGaKLzF76/C3p+shmrdp+vIZUoVsuXLY3n00dmsX38YgLvuasjYsZ2pUqWMw5E5T79tvMGe+bB8BCDQ9XPrsValVKF68cXFrF9/mJo1Ixg/vitdu9Z1OqRiQxNFcZcQC3PuAwxcMxyq3+h0REr5BGMMCQlnKVPGqnMYP/5mpk5dxwsvtCMsTHsXcKWPxxZn6akwuxecOQbVO0HrF5yOSCmfsG3bMW666TPuuONLjLF6Ma5fvzyvv36jJokc6B1FcfbLc3DgNyhdBbpO015UlbpEyclpvPHGL4wcuYyzZ9OJigplz55T1Kzpm11vFBZNFEUtYT9s/yr/nljPHIPVY6xK6+5fWd1tK6Uu2oIFf9G//xx27jwBwMMPN2PUqI5ERYU5HFnx59FEISJdgHcBf+BjY8zIbMurAf8FIux1njPGzPFkTI77dShs/sz99a97E6pc47l4lPJxxhj69p3Fp5+uBaBhwwpMmtSN666r7nBk3sNjiUJE/IEJQEcgFlgpIrOMMZtdVhsGfGWMmSgiDYE5QA1PxVQspMRZv2v3gHL5PFVR/kpo2MfzMSnlw0SEGjUiCA0N4KWX2jNoUBuf7sDPEzx5R9ES2GmM2QUgItOBHoBrojBA5kPKZYEDHoyneGn8ENTp4XQUSvmktWsPcfBgAjffbF2MDRnSlj59mmhdxEXyZO1oFWCfy3SsPc/VK8B9IhKLdTfxZE4bEpFHRGSViKw6evSoJ2JVSvmAhIQUBg2aT4sWH/LAA99y4sQZAIKDAzRJXAJPJoqcxgA02abvBqYYY6oCXYHPRC58tMcY86ExJsYYE1OhglbqKqXOZ4xh5swtNGz4PmPHLgfgnnuuJDBQnxQsDJ4seooFrnCZrsqFRUt9gS4AxpjfRSQEKA8c8WBcSikf8vffp3jiibnMnr0dgJiYy/ngg+5cdVVlhyPzHZ5MtyuBuiJSU0SCgN7ArGzr7AVuBBCRaCAE0LIlpZRbjDH07PkVs2dvp0yZYMaPv5nly/tqkihkHrujMMakicgTwHysR18nG2M2ichwYJUxZhbwDPCRiAzEKpZ60GQ2k1RKqVxkZBj8/AQRYfToTkyatIqxYztTuXK406H5JI+2o7DbRMzJNu8ll9ebgbaejEEp5TuOH0/iuecWAvDRR7cC0KFDDTp0qOFgVL5Pa3qUUsWeMYb//nctDRpM4OOP1zB16npiY+OdDqvE0C48lFLF2pYtR3nssR/4+ee/AesOYuLEblStquNEFBVNFEqpYskYw0svLebNN5eRmppB+fJhvP12J/r0aYJITk/fK0/RRKGUKpZEhP37E0hNzeBf/7qKkSNvIjIy1OmwSiRNFEUtNcn6rUOZKnWBAwcSOHYsiSZNKgEwalRH+vZtTtu21RyOrGTTyuyidmyD9TuygbNxKFWMpKdnMH78CqKjJ9C79wzOnk0HoHz5ME0SxYBe1halxIOQdBiCykDZmk5Ho1Sx8OefB3n00dmsWmV13NCuXXXi41MoX17HiSgu3EoUdsvqasaYnR6Ox7cdtfrDp2IzHa1OlXjx8Sm8+OJPjB+/kowMQ9WqZRg3rgu33dZAK6uLmXwThYh0A8YAQUBNEWkGvGyMud3TwfmcI2us3xWbOxuHUg4zxtCu3aesW3cYf39h0KDWvPJKB8LDg50OTeXAncva4UAr4BSAMWYtUMeTQfmszERRoZmzcSjlMBFh4MDWtGxZhVWrHuHttztrkijG3Cl6SjXGnMp2K6j9MV2MI5lFT3pHoUqWs2fTGTPmd/z9hcGDrV577r+/Kffd1wR/fy2GLe7cSRRbROQfgJ+I1ASeBpZ7NiwflBIPp3aCfxBERTsdjVJF5pdf/qZfvx/YvPkowcH+3H9/UypVKo2I4O+vdRHewJ1U/gTQAsgA/gckYyULVRBH11m/oxpZyUIpH3fsWBIPP/wd7dpNYfPmo9StG8ns2fdQqVJpp0NTBeTOHUVnY8wQYEjmDBG5AytpKHdpsZMqIYwxTJmylsGDF3D8+BmCgvwZOvRannvuWkJC9Il8b+TOHcWwHOa9UNiB+Dx94kmVINOmbeD48TPccENN1q/vxyuvdNAk4cVy/cuJSGesYUqriMgYl0VlsIqhVEHoE0/KhyUlpRIXl0zlyuGICO+/35WVKw9w771XapsIH5BXij8CbMSqk9jkMj8BeM6TQfmc9LNwfBMgULGp09EoVajmzt3B44/PoVatcixY0AcRoX798tSvX97p0FQhyTVRGGPWAGtE5P+MMclFGJPvOb4ZMlKhXF0I0qEalW/Yvz+eAQPmM2PGZgDCw4M5fvyMdr3hg9wpNKwiIq8DDYGQzJnGmHoei8rXaLGT8iHp6RlMmLCSYcN+IiHhLKVKBTJ8+PU89VQrAgK0TYQvcidRTAFGAKOBm4GH0DqKgtEnnpSPyMgwtG8/hWXL9gFw220NePfdLlSrVtbhyJQnuZP+w4wx8wGMMX8ZY4YB13s2LB+jTzwpH+HnJ3TqVJsrrijDd9/1ZubMXpokSgB37ihSxHps4S8R6QfsByp6NiwfYjJceo3VRKG8izGGr77aRECAHz17NgRgyJC2DBrUhtKlteFoSeFOohgIlAaeAl4HygIPezIon3JqF5xNgFKXQalKTkejlNv++usE/fvP4ccf/6JChTBuuKEm5cqFEhwcQLD231ei5JsojDF/2C8TgD4AIlLVk0H5FL2bUF4mJSWNt976jddf/4Xk5DTKlQvh9ddvoGzZkPzfrHxSnolCRK4GqgC/GmOOiUgjrK48bgA0WbhD6yeUF1myZA+PPfYDW7ceA6BPnyaMHt2JihVLORyZclKuldki8gbwf8C9wDwReQFYDKwD9NFYd+mjscpLpKdn0L+/lSTq14/ip5/uZ+rU2zVJqDzvKHoATY0xZ0QkEjhgT28rmtB8hD4aq4qxjAxDcnIaYWGB+Pv7MXFiN5Yu/Ztnn21LcLD2zaQseX0Sko0xZwCMMSdEZKsmiQI6fRhOH7RaY0fUcjoapc6zYcNh+vX7gQYNovjkkx4AtG9fg/btazgbmCp28koUtUQksytxAWq4TGOMucOjkfmCrGKnpiDaYlUVD6dPn2X48J8ZM2Y5aWkZ7N59kpMnz1CuXKjToaliKq9E0TPb9HhPBuKTtNhJFTPff7+NJ56Yy969cYhA//4xvP76jURE6BNNKnd5dQq4qCgD8Un6xJMqJtLSMujVawb/+98WAJo1u4wPPuhOy5ZVHI5MeQOtrfKko/rEkyoeAgL8KFs2mNKlg3jttet54omW2oGfcptHPyki0kVEtonIThHJcQwLEfmHiGwWkU0i8rkn4ylSZxPg5E7wC4TyjZyORpVAf/wRyx9/xGZNv/VWR7ZseZwBA1prklAF4vYdhYgEG2NSCrC+PzAB6AjEAitFZJYxZrPLOnWBoUBbY8xJEfGdPqSOrgcMRDUCf+0TRxWdU6eSGTp0IR98sJoGDcqzdm0/goL8iYrScSLUxcn3skJEWorIBmCHPd1URN5zY9stgZ3GmF3GmLPAdKy2Ga7+BUwwxpwEMMYcKVD0xZnWT6giZozh88830KDBeCZNWo2/vx+33lqf9HQdFUBdGnfuKMYB3YFvAYwx60TEnW7GqwD7XKZjgVbZ1qkHICLLAH/gFWPMPDe2XfxlPfGk9RPK83bsOE7//nNYuHAXAG3bXsGkSd1p3Nh3btKVc9xJFH7GmL+zDZCe7sb7chpR3eSw/7pAB6y+o34RkcbGmFPnbUjkEeARgGrVqrmx62JA7yhUEUlNTeeGG6YSGxtPZGQoo0bdxEMPNcfPL6d/QaUKzp1EsU9EWgLGrnd4EtjuxvtigStcpqtidQOSfZ3lxphUYLeIbMNKHCtdVzLGfAh8CBATE5M92RQ/6alwfKP1ukJTZ2NRPssYg4gQGOjP66/fwOLFexg16iYqVNC+mVThcufRh8eAQUA14DDQ2p6Xn5VAXRGpKSJBQG9gVrZ1vsUeLU9EymMVRe1yL/Ri7PhmSD8LEbUhuIzT0Sgfc/hwIn36zGTEiKVZ8+6/vymfftpDk4TyCHfuKNKMMb0LumFjTJqIPAHMx6p/mGyM2SQiw4FVxphZ9rJOIrIZqzhrsDHmeEH3VezoGBTKAzIyDB99tJrnnlvEqVPJRESEMGBAa8LDdRQh5VnuJIqVdpHQl8D/jDEJ7m7cGDMHmJNt3ksurw3W3cogd7fpFbR+QhWydesO0a/fDyxfbrWL6NKlDhMmdNUkoYqEOyPc1RaRa7CKjl4VkbXAdGPMdI9H5610DApVSFJT0xk6dBHvvLOc9HRD5cqleffdLtx5Z0OyPWCilMe41TzTGPObMeYp4CogHmtAI5UTY7QzQFVoAgL8WLPmEBkZhiefbMmWLY9z112NNEmoIpXvHYWIlMZqKNcbiAa+A67xcFzeK243nI2HsEpQurLT0SgvtHdvHOnpGdSsWQ4RYdKkbsTFpRATc7nToakSyp06io3A98AoY8wvHo7H+2n9hLpIqanpvPvuH7z88hLatKnKggV9EBHq1o1yOjRVwrmTKGoZY7QPAHcd1RbZquB+/30f/fr9wPr1hwGIjAwlKSmVUqW0nzDlvFwThYi8bYx5BvhGRC5o5KYj3OVC7yhUAZw8eYbnnlvIhx/+CUDNmhFMmNCVm2+u63BkSp2T1x3Fl/ZvHdmuIDRRKDelpKTRrNkH7HFzjqIAACAASURBVN0bR2CgH4MHX8MLL7QjLCzQ6dCUOk9eI9ytsF9GG2POSxZ2QzodAS+7pCOQeAACS1utspXKQ3BwAH37NmfRot1MnNiNhg0rOB2SUjly5/HYh3OY17ewA/EJmY/FVmgKogPDqPMlJ6fx8suL+fzzDVnznn/+OpYseUCThCrW8qqj6IX1SGxNEfmfy6Jw4FTO7yrhtNhJ5WLBgr/o338OO3eeoGLFUtx+ewNCQwN1pDnlFfKqo1gBHMfq9XWCy/wEYI0ng/JaWYlCn3hSlkOHEhk0aD5ffGH1JtyoUQUmTepOaKjWQyjvkVcdxW5gN7Cw6MLxctoiW9nS0zP44IPVPP/8IuLiUggNDeDll9szcGAbgoL8nQ5PqQLJq+jpZ2NMexE5yfkDDglWf36RHo/Om5xNhJPbwS/AGidblWjp6Yb33ltBXFwKXbvWZfz4m6lZs5zTYSl1UfIqesoc7rR8UQTi9Y6uBwxENYQA7dGzJEpISCE93RAREUJQkD8ffXQLhw8ncscd0do3k/JqudakubTGvgLwN8akA22ARwEdHSU7HYOixDLG8L//bSE6egLPPDM/a/6111ajZ0/t5VV5P3ceufgWaxjU2sBUrI4BP/doVN5otz3sxmUtnY1DFak9e05x663T6dnzK/bvT2DjxqMkJ6c5HZZShcqdRJFhj2l9B/COMeZJoIpnw/IyiQdg91yrfqLeXU5Ho4pAamo6b775Kw0bTmD27O2UKRPM+PE389tvDxMS4k4Xakp5D7eGQhWRu4A+wG32PH22z9Xmz8BkQO0eEKYNp3xdUlIqrVt/zIYNRwDo3bsxY8Z0onLlcIcjU8oz3EkUDwP9sboZ3yUiNYEvPBuWFzEGNn5qvW78kLOxqCIRFhZITMzlJCWl8v773ejUSbtrUb5NrGGr81lJJACoY0/uNMY4VggbExNjVq1a5dTuL7T/N5jeFkpdBo/ss4qflE8xxjB16jpq147k2murARAXl0xQkL82nFNeQ0RWG2NiLua97oxwdx3wGbAfqw3FZSLSxxiz7GJ26HM22XcT0X00SfigLVuO8thjP/Dzz38THV2etWv7ERTkT9myIU6HplSRceebbSzQ1RizGUBEorESx0VlJp+Sehq22b2xa7GTTzlzJpXXX/+FUaOWkZqaQYUKYQwdei2Bgdo3kyp53EkUQZlJAsAYs0VEdNgtgO3fwNkEqNwaoqKdjkYVknnzdvL443PYteskAP/611WMHHkTkZGhDkemlDPcSRR/isgHWHcRAPeinQJaNmkltq9JTDxLnz4zOXYsicaNKzJpUjfatq3mdFhKOcqdRNEPeAp4FquOYinwnieD8gqndsG+JRAQCvV7OR2NugTp6RlkZBgCA/0pXTqId9/tQmxsPAMHtiYwUDvwUyrPRCEiVwK1gZnGmFFFE5KX2DTF+l23JwSXdTQUdfFWrz7Ao4/OpkeP+rz4YnsA7rnnSoejUqp4ybVmTkSex+q+415ggYjkNNJdyZSRfi5RaLGTV4qPT+Hpp+fSsuXHrF59kM8+W09qarrTYSlVLOV1R3Ev0MQYc1pEKgBzgMlFE1Yxt/cnSNgHZWrAFR2cjkYVgDGGGTM28/TT8zh4MBF/f2HQoNa8+ur1WsykVC7yShQpxpjTAMaYoyI6CHSWzErsRg/q2NheJCEhhV69ZjB37k4AWrWqwqRJ3WnW7DKHI1OqeMsrUdRyGStbgNquY2cbY+7waGTFVfJJ2PE/QKDxg05HowqgdOkgUlLSKVs2mJEjb+KRR1rg56ddgCuVn7wSRc9s0+M9GYjX2Dod0lOg2o1QprrT0ah8LF36N5Url6Zu3ShEhMmTbyUkJIBKlUo7HZpSXiOvMbMXFWUgXkPbTniFY8eSePbZBXz66VpuvLEmCxb0QUSoXj3C6dCU8jraOVFBHNsIh1Zaj8PWKZklb8VdRoZhypS1DB68gBMnzhAU5M9111UjPd0QEKDFTEpdDI/WxIpIFxHZJiI7ReS5PNa7U0SMiBTv/qMyuxOv3xsCtTuH4mbTpiN06DCFvn1nceLEGW68sSYbNjzGyy93ICBAHzpQ6mK5fUchIsHGmJQCrO8PTAA6ArHAShGZ5dpvlL1eOFbL7z/c3bYj0lOtAYpAi52Kobi4ZFq3/oTExLNUrFiKMWM6cc89V+p41UoVgnwvs0SkpYhsAHbY001FxJ0uPFpijV2xyxhzFpgO9MhhvdeAUUCy+2E7YNcPcOYoRDXUcbGLkczxVMqWDWHIkLb069eCrVsf5957m2iSUKqQuHM/Pg7oDhwHMMasA653431VgH0u07FkG2tbRJoDVxhjZue1IRF5RERWiciqo0ePurFrD8hqO/EQ6BeQ4/bvj+fOO79i2rT1WfNeeOE6Jk7sTrlyWiyoVGFyJ1H4GWP+zjbPnb4Ocvo2zRpOz27ANxZ4Jr8NGWM+NMbEGGNiKlRwYEzq04esOwrxh4Z9in7/KktaWgbvvrucBg0m8M03W3j55SWkp2cA6B2EUh7iTh3FPhFpCRi73uFJYLsb74sFrnCZrgoccJkOBxoDS+x/8MuAWSJyqzGmGI11CmyeBiYdat8KpSo5HU2JtXLlfvr1+4E//zwIwG23NWDcuC74+2tFtVKe5E6ieAyr+KkacBhYaM/Lz0qgrojUxBpGtTdwT+ZCY0wcUD5zWkSWAP8udknCmPOLnVSRO336LEOGLOT991diDFSrVpb33ruZW2+t73RoSpUI+SYKY8wRrC/5AjHGpInIE8B8wB+YbIzZJCLDgVXGmFkFjtYJh1bA8c0QVhFqdXM6mhIpIMCPhQt34ecnDBrUhpdfbk+pUjrIolJFJd9EISIf4VK3kMkY80h+7zXGzMHqddZ13ku5rNshv+05IrPtRPR94B/obCwlyF9/nSAiIoSoqDCCgwP47LPbCQkJ4MortehPqaLmTuHuQmCR/bMMqAi43Z7Cq6UmwdYvrNfadqJIpKSkMWLEUho3nsiQIQuz5l99dRVNEko5xJ2ipy9dp0XkM2CBxyIqTnbOhLPxcNnVUL6x09H4vCVL9vDYYz+wdesxwHrCKT09QyurlXLYxfT1VBMoGd2mbtRK7KJw5MhpBg9ewNSp6wCoXz+KiRO7cf31NR2OTCkF7tVRnORcHYUfcALItd8mnxG3xxrJLiAEGtztdDQ+69ixJKKjJ3DixBmCg/154YXrePbZtgQHa3+VShUXef43itXAoSnW460AGSazzwRft+m/gIE6t0OIdk3tKeXLh9GjR31iY+N5//1u1KkT6XRISqls8kwUxhgjIjONMS2KKqBiwWTApinWay12KlSnT59l+PCf6datHu3aWSWY77/fjeBgf21ZrVQx5U4t4QoRucrjkRQn+5ZA/B4IrwbVbnA6Gp/x/ffbaNjwfUaN+o3+/X8gI8O6OQ0JCdAkoVQxlusdhYgEGGPSgGuBf4nIX8BprD6cjDHGd5NHViX2A+Dn72wsPmDfvjiefnoeM2duBaB588v44IPuOl61Ul4ir6KnFcBVwG1FFEvxkBIHO76xXjd60NFQvF1aWgbjxv3BSy8t5vTpVEqXDmLEiOt5/PGWOpCQUl4kr0QhAMaYv4ooluJh25eQdgau6AARtZyOxqvFx6fwxhu/cvp0Kj17RvPOO12oWrWM02EppQoor0RRQUQG5bbQGDPGA/E4T9tOXJJTp5IJDQ0gODiAyMhQPvigO8HB/nTrVs/p0JRSFymv+39/oDRWd+A5/fie41vg4HIICod6PZ2OxqsYY/j88w3Urz+eUaOWZc2/445oTRJKebm87igOGmOGF1kkxUHm3UT9XhBYytlYvMj27cfp3/8HFi3aDcDSpXsxxuiTTEr5iHzrKEqM9FTYPNV6rcVObklOTuPNN3/lP//5lbNn04mMDOWttzry4IPNNEko5UPyShQ3FlkUxcGeeZB0GMrVh8vbOB1NsXfoUCLt2n3Kjh0nAHjwwWa89VZHypcPczgypVRhyzVRGGNOFGUgjsssdmr8EOjVcL4qVSrFFVeUJSDAj4kTu9G+fQ2nQ1JKeYj2vAaQdBR2fQ/iDw3vdzqaYikjw/DRR6u5/vqa1KsXhYjw+ed3UK5cKEFB2ihRKV+mrZ4AtkyDjDSo2QVKV3Y6mmJn3bpDtG07mX79fqB//x/I7BeyUqXSmiSUKgH0jsIYbTuRi8TEs7zyyhLeeWc56emGyy8Pp1+/GKfDUkoVMU0Uh1fDsQ0QWh5q3+J0NMXGt99u5ckn5xIbG4+fn/Dkky0ZMeIGypQJdjo0pVQR00SReTcRfS/4BzkbSzGxf388vXvPICUlnRYtKjNpUndiYi53OiyllENKdqJIS4atn1uvS3ixU2pqOgEBfogIVaqU4fXXbyAoyJ/+/a/WMauVKuFK9jfAzm8h5RRUvAoqNnU6Gsf89ts+WrT4kGnT1mfNe+aZa3jyyVaaJJRSJTxRuLadKIFOnDjDo49+T9u2k9mw4Qjvv7+KkjLSrVLKfSW36Cl+L/y9wKqXaHCP09EUKWMM06at55lnfuTo0SQCA/149tm2vPDCddr1hlLqAiU3UWyeChiofRuERjodTZE5fDiRu+/+hsWL9wDQvn11Jk7sRnR0BWcDU0oVWyUzUZiMElvsFBERwsGDiZQvH8bo0R25//6mehehlMpTyUwUsb9A3C4oXQWqd3Q6Go9bsOAvrrqqMlFRYQQHB/D113dRuXJpoqK0Az+lVP5KZmX2psyW2A+An+92QXHwYAJ33/0NnTpNY8iQhVnzGzeuqElCKeW2kndHcTYBtn1tvfbRthPp6Rl88MFqhg5dRHx8CqGhAdSvH6WDCSmlLkrJSxTbvoK0JKhyHZSr43Q0he7PPw/Sr99sVq48AEC3bnUZP74rNWpEOByZUspblbxE4cOV2Hv2nKJly49ITzdUqRLOuHE3c/vtDfQuQil1STyaKESkC/Au4A98bIwZmW35IOCfQBpwFHjYGPO3xwI6sQ0OLLPGw653l8d245QaNSJ46KFmhIcH8+qrHQgP1w78lFKXzmOV2SLiD0wAbgYaAneLSMNsq60BYowxTYAZwChPxQPApinW73r/gKDSHt1VUdiz5xS33PIFP/+8J2vehx/ewpgxnTVJKKUKjSfvKFoCO40xuwBEZDrQA9icuYIxZrHL+suB+zwWTUaa3cgOry92Sk1NZ8yY33n11Z85cyaNY8eS+P33vgBazKSUKnSeTBRVgH0u07FAqzzW7wvMzWmBiDwCPAJQrVq1i4tmz4+QeAAi6kCVay9uG8XAr7/upV+/2WzadBSA3r0bM2ZMJ4ejUkr5Mk8mipwubXPscU5E7gNigPY5LTfGfAh8CBATE3NxvdZtcqnE9sKr7pMnzzB48AI++WQNALVrl+P997vRqVNthyNTSvk6TyaKWOAKl+mqwIHsK4nITcALQHtjTIpHIkk6Bju/A/GDhvd7ZBeelpFh+O67bQQG+vHcc9cydOi1hIYGOh2WUqoE8GSiWAnUFZGawH6gN3BeN60i0hz4AOhijDnisUi2fg4ZqVCjC4RX9dhuCtvWrceoWTOC4OAAoqLC+L//u4Nq1crSoEF5p0NTSpUgHnvqyRiTBjwBzAe2AF8ZYzaJyHARudVe7S2gNPC1iKwVkVkeCcbL2k4kJaXywguLaNJkIqNGLcua36lTbU0SSqki59F2FMaYOcCcbPNecnl9kyf3D8DhNXB0LYREQu0eHt/dpZo3byf9+//A7t2nADh2LMnhiJRSJZ3vt8zOrMRucA8EFN+2BQcOJDBgwDy+/tp6evjKKysyaVJ3rrnminzeqZRSnuXbiSItBbb8n/W68cPOxpKH7duPExPzIQkJZwkLC+SVV9ozYEBrAgN9t2dbpZT38O1E8dcsSD4BFZpCpeZOR5OrunUjufrqKpQqFch7791M9eragZ9Sqvjw7USxqXhWYsfHp/DSS4vp3/9q6tWLQkSYNas3pUoFOR2aUkpdwHcTRcJ+2DMf/AKhwb1ORwOAMYYZMzbz9NPzOHgwka1bjzFvntVriSYJpVRx5buJYvNUa2zsOrdDmPOPlO7adZInnpjD3Lk7AWjduipvvun5h76UUupS+WaiMKbYFDudPZvO6NG/8dprS0lOTiMiIoSRI2/kX/9qgZ+f93UlopQqeXwzUexfBid3QKnKUKOzo6Hs2xfH8OE/k5KSzr33Xsnbb3eiUiXv7+JcKVVy+GaiyLybaHg/+BX9IZ48eYaIiBBEhNq1I3n33S7UqRPJjTfWKvJYlFLqUnmsCw/HnE20xsWGIi92ysgwTJ68hjp13mPatPVZ8x99NEaThFLKa/leotg+A1IT4fJrILJ+ke1206YjdOgwhb59Z3HixJmsSmullPJ2vlf0lFns1Kho7iaSklJ57bWfGT36d9LSMqhYsRRjx3bm7rsbF8n+lVLK03wrUZzcCbFLISAM6v/D47vbvv04nTtPY8+eU4hAv34t+M9/bqRcuVCP71sppYqKbyWKTVOs3/XuhOAyHt9d9eplCQkJoGnTSkya1J3Wrb1nrAvleampqcTGxpKcnOx0KKoECQkJoWrVqgQGFt7AZr6TKDLSYdN/rdceqsROS8tg0qRV3H13Y6KiwggODmDevHupUqUMAQG+V92jLk1sbCzh4eHUqFED8cLhd5X3McZw/PhxYmNjqVmzZqFt13e+3fYuhMRYKFsLqrYr9M2vWLGfli0/4skn5zJkyMKs+dWrR2iSUDlKTk4mKipKk4QqMiJCVFRUod/F+s4dReYodo0etMbGLiRxccm88MJPvP/+SoyBatXK0qNH0T1NpbybJglV1DzxmfONRHHmBOycCQg0eqBQNmmM4csvNzFw4HwOHUokIMCPQYNa89JL7bUDP6VUieIbZSZbv4D0s1D9JihTrVA2uW7dYe6++xsOHUrkmmuu4M8/H+HNNztqklBexd/fn2bNmtG4cWNuueUWTp06lbVs06ZN3HDDDdSrV4+6devy2muvYYzJWj537lxiYmKIjo6mQYMG/Pvf/3biEPK0Zs0a/vnPfzodRp7eeOMN6tSpQ/369Zk/f36O6yxatIirrrqKZs2ace2117Jz5/ntsGbMmIGIsGrVKgA2bNjAgw8+6OnQzzHGeNVPixYtzAU+a2HMaIzZ/PmFywogLS39vOmBA+eZjz5abdLTMy5pu6pk2rx5s9MhmFKlSmW9vv/++82IESOMMcYkJSWZWrVqmfnz5xtjjDl9+rTp0qWLGT9+vDHGmA0bNphatWqZLVu2GGOMSU1NNRMmTCjU2FJTUy95G3feeadZu3Ztke6zIDZt2mSaNGlikpOTza5du0ytWrVMWlraBevVrVs36/MyYcIE88ADD2Qti4+PN9ddd51p1aqVWblyZdb8G2+80fz999857jenzx6wylzk9673Fz0dXQ+HV0NwBNS57aI3s3jxbvr3n8MHH3SnXbvqAIwZ42yHgsqHvO2huopnTP7r2Nq0acP69VbXMp9//jlt27alU6dOAISFhTF+/Hg6dOjA448/zqhRo3jhhRdo0KABAAEBAfTv3/+CbSYmJvLkk0+yatUqRISXX36Znj17Urp0aRITEwHranj27NlMmTKFBx98kMjISNasWUOzZs2YOXMma9euJSLCGtWxTp06LFu2DD8/P/r168fevXsBeOedd2jbtu15+05ISGD9+vU0bdoUgBUrVjBgwADOnDlDaGgon376KfXr12fKlCn88MMPJCcnc/r0aX766SfeeustvvrqK1JSUrj99tt59dVXAbjtttvYt28fycnJPP300zzyyCNun9+cfPfdd/Tu3Zvg4GBq1qxJnTp1WLFiBW3atDlvPREhPj4egLi4OC6//PKsZS+++CLPPvsso0ePPu89t9xyC9OnT+fZZ5+9pBjd4f2JIrMSu8HdEFjwhm5Hjpxm8OAFTJ26DoAxY37PShRK+Yr09HQWLVpE3759AavYqUWLFuetU7t2bRITE4mPj2fjxo0888wz+W73tddeo2zZsmzYsAGAkydP5vue7du3s3DhQvz9/cnIyGDmzJk89NBD/PHHH9SoUYNKlSpx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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_score = classifier.fit(X_train, y_train).decision_function(X_test)\n",
    "\n",
    "# Compute ROC curve and ROC area for each class\n",
    "fpr = dict()\n",
    "tpr = dict()\n",
    "roc_auc = dict()\n",
    "for i in range(n_classes):\n",
    "    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])\n",
    "    roc_auc[i] = auc(fpr[i], tpr[i])\n",
    "\n",
    "# Compute micro-average ROC curve and ROC area\n",
    "fpr[\"micro\"], tpr[\"micro\"], _ = roc_curve(y_test.ravel(), y_score.ravel())\n",
    "roc_auc[\"micro\"] = auc(fpr[\"micro\"], tpr[\"micro\"])\n",
    "\n",
    "plt.figure()\n",
    "lw = 2\n",
    "plt.plot(fpr[2], tpr[2], color='darkorange',\n",
    "         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])\n",
    "plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
    "plt.xlim([0.0, 1.0])\n",
    "plt.ylim([0.0, 1.05])\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('Receiver operating characteristic example')\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "## StackingCVClassifier\n",
      "\n",
      "*StackingCVClassifier(classifiers, meta_classifier, use_probas=False, drop_proba_col=None, cv=2, shuffle=True, random_state=None, stratify=True, verbose=0, use_features_in_secondary=False, store_train_meta_features=False, use_clones=True, n_jobs=None, pre_dispatch='2*n_jobs')*\n",
      "\n",
      "A 'Stacking Cross-Validation' classifier for scikit-learn estimators.\n",
      "\n",
      "New in mlxtend v0.4.3\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `classifiers` : array-like, shape = [n_classifiers]\n",
      "\n",
      "    A list of classifiers.\n",
      "    Invoking the `fit` method on the `StackingCVClassifer` will fit clones\n",
      "    of these original classifiers that will\n",
      "    be stored in the class attribute `self.clfs_`.\n",
      "\n",
      "- `meta_classifier` : object\n",
      "\n",
      "    The meta-classifier to be fitted on the ensemble of\n",
      "    classifiers\n",
      "\n",
      "- `use_probas` : bool (default: False)\n",
      "\n",
      "    If True, trains meta-classifier based on predicted probabilities\n",
      "    instead of class labels.\n",
      "\n",
      "- `drop_proba_col` : string (default: None)\n",
      "\n",
      "    Drops extra \"probability\" column in the feature set, because it is\n",
      "    redundant:\n",
      "    p(y_c) = 1 - p(y_1) + p(y_2) + ... + p(y_{c-1}).\n",
      "    This can be useful for meta-classifiers that are sensitive to perfectly\n",
      "    collinear features.\n",
      "    If `last`, drops last probability column.\n",
      "    If `first`, drops first probability column.\n",
      "    Only relevant if `use_probas=True`.\n",
      "\n",
      "- `cv` : int, cross-validation generator or an iterable, optional (default: 2)\n",
      "\n",
      "    Determines the cross-validation splitting strategy.\n",
      "    Possible inputs for cv are:\n",
      "    - None, to use the default 2-fold cross validation,\n",
      "    - integer, to specify the number of folds in a `(Stratified)KFold`,\n",
      "    - An object to be used as a cross-validation generator.\n",
      "    - An iterable yielding train, test splits.\n",
      "    For integer/None inputs, it will use either a `KFold` or\n",
      "    `StratifiedKFold` cross validation depending the value of `stratify`\n",
      "    argument.\n",
      "\n",
      "- `shuffle` : bool (default: True)\n",
      "\n",
      "    If True,  and the `cv` argument is integer, the training data will be\n",
      "    shuffled at fitting stage prior to cross-validation. If the `cv`\n",
      "    argument is a specific cross validation technique, this argument is\n",
      "    omitted.\n",
      "\n",
      "- `random_state` : int, RandomState instance or None, optional (default: None)\n",
      "\n",
      "    Constrols the randomness of the cv splitter. Used when `cv` is\n",
      "    integer and `shuffle=True`. New in v0.16.0.\n",
      "\n",
      "- `stratify` : bool (default: True)\n",
      "\n",
      "    If True, and the `cv` argument is integer it will follow a stratified\n",
      "    K-Fold cross validation technique. If the `cv` argument is a specific\n",
      "    cross validation technique, this argument is omitted.\n",
      "\n",
      "- `verbose` : int, optional (default=0)\n",
      "\n",
      "    Controls the verbosity of the building process.\n",
      "    - `verbose=0` (default): Prints nothing\n",
      "    - `verbose=1`: Prints the number & name of the regressor being fitted\n",
      "    and which fold is currently being used for fitting\n",
      "    - `verbose=2`: Prints info about the parameters of the\n",
      "    regressor being fitted\n",
      "    - `verbose>2`: Changes `verbose` param of the underlying regressor to\n",
      "    self.verbose - 2\n",
      "\n",
      "- `use_features_in_secondary` : bool (default: False)\n",
      "\n",
      "    If True, the meta-classifier will be trained both on the predictions\n",
      "    of the original classifiers and the original dataset.\n",
      "    If False, the meta-classifier will be trained only on the predictions\n",
      "    of the original classifiers.\n",
      "\n",
      "- `store_train_meta_features` : bool (default: False)\n",
      "\n",
      "    If True, the meta-features computed from the training data used\n",
      "    for fitting the meta-classifier stored in the\n",
      "    `self.train_meta_features_` array, which can be\n",
      "    accessed after calling `fit`.\n",
      "\n",
      "- `use_clones` : bool (default: True)\n",
      "\n",
      "    Clones the classifiers for stacking classification if True (default)\n",
      "    or else uses the original ones, which will be refitted on the dataset\n",
      "    upon calling the `fit` method. Hence, if use_clones=True, the original\n",
      "    input classifiers will remain unmodified upon using the\n",
      "    StackingCVClassifier's `fit` method.\n",
      "    Setting `use_clones=False` is\n",
      "    recommended if you are working with estimators that are supporting\n",
      "    the scikit-learn fit/predict API interface but are not compatible\n",
      "    to scikit-learn's `clone` function.\n",
      "\n",
      "- `n_jobs` : int or None, optional (default=None)\n",
      "\n",
      "    The number of CPUs to use to do the computation.\n",
      "    ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.\n",
      "    ``-1`` means using all processors. See :term:`Glossary <n_jobs>`\n",
      "    for more details. New in v0.16.0.\n",
      "\n",
      "- `pre_dispatch` : int, or string, optional\n",
      "\n",
      "    Controls the number of jobs that get dispatched during parallel\n",
      "    execution. Reducing this number can be useful to avoid an\n",
      "    explosion of memory consumption when more jobs get dispatched\n",
      "    than CPUs can process. This parameter can be:\n",
      "    - None, in which case all the jobs are immediately\n",
      "    created and spawned. Use this for lightweight and\n",
      "    fast-running jobs, to avoid delays due to on-demand\n",
      "    spawning of the jobs\n",
      "    - An int, giving the exact number of total jobs that are\n",
      "    spawned\n",
      "    - A string, giving an expression as a function of n_jobs,\n",
      "    as in '2*n_jobs'\n",
      "    New in v0.16.0.\n",
      "\n",
      "**Attributes**\n",
      "\n",
      "- `clfs_` : list, shape=[n_classifiers]\n",
      "\n",
      "    Fitted classifiers (clones of the original classifiers)\n",
      "\n",
      "- `meta_clf_` : estimator\n",
      "\n",
      "    Fitted meta-classifier (clone of the original meta-estimator)\n",
      "\n",
      "- `train_meta_features` : numpy array, shape = [n_samples, n_classifiers]\n",
      "\n",
      "    meta-features for training data, where n_samples is the\n",
      "    number of samples\n",
      "    in training data and n_classifiers is the number of classfiers.\n",
      "\n",
      "**Examples**\n",
      "\n",
      "For usage examples, please see\n",
      "    [http://rasbt.github.io/mlxtend/user_guide/classifier/StackingCVClassifier/](http://rasbt.github.io/mlxtend/user_guide/classifier/StackingCVClassifier/)\n",
      "\n",
      "### Methods\n",
      "\n",
      "<hr>\n",
      "\n",
      "*decision_function(X)*\n",
      "\n",
      "Predict class confidence scores for X.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : {array-like, sparse matrix}, shape = [n_samples, n_features]\n",
      "\n",
      "    Training vectors, where n_samples is the number of samples and\n",
      "    n_features is the number of features.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `scores` : shape=(n_samples,) if n_classes == 2 else             (n_samples, n_classes).\n",
      "\n",
      "    Confidence scores per (sample, class) combination. In the binary\n",
      "    case, confidence score for self.classes_[1] where >0 means this\n",
      "    class would be predicted.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*fit(X, y, groups=None, sample_weight=None)*\n",
      "\n",
      "Fit ensemble classifers and the meta-classifier.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : numpy array, shape = [n_samples, n_features]\n",
      "\n",
      "    Training vectors, where n_samples is the number of samples and\n",
      "    n_features is the number of features.\n",
      "\n",
      "\n",
      "- `y` : numpy array, shape = [n_samples]\n",
      "\n",
      "    Target values.\n",
      "\n",
      "\n",
      "- `groups` : numpy array/None, shape = [n_samples]\n",
      "\n",
      "    The group that each sample belongs to. This is used by specific\n",
      "    folding strategies such as GroupKFold()\n",
      "\n",
      "\n",
      "- `sample_weight` : array-like, shape = [n_samples], optional\n",
      "\n",
      "    Sample weights passed as sample_weights to each regressor\n",
      "    in the regressors list as well as the meta_regressor.\n",
      "    Raises error if some regressor does not support\n",
      "    sample_weight in the fit() method.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `self` : object\n",
      "\n",
      "\n",
      "<hr>\n",
      "\n",
      "*fit_transform(X, y=None, **fit_params)*\n",
      "\n",
      "Fit to data, then transform it.\n",
      "\n",
      "Fits transformer to X and y with optional parameters fit_params\n",
      "and returns a transformed version of X.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : numpy array of shape [n_samples, n_features]\n",
      "\n",
      "    Training set.\n",
      "\n",
      "\n",
      "- `y` : numpy array of shape [n_samples]\n",
      "\n",
      "    Target values.\n",
      "\n",
      "\n",
      "- `**fit_params` : dict\n",
      "\n",
      "    Additional fit parameters.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `X_new` : numpy array of shape [n_samples, n_features_new]\n",
      "\n",
      "    Transformed array.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*get_params(deep=True)*\n",
      "\n",
      "Return estimator parameter names for GridSearch support.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*predict(X)*\n",
      "\n",
      "Predict target values for X.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : numpy array, shape = [n_samples, n_features]\n",
      "\n",
      "    Training vectors, where n_samples is the number of samples and\n",
      "    n_features is the number of features.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `labels` : array-like, shape = [n_samples]\n",
      "\n",
      "    Predicted class labels.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*predict_meta_features(X)*\n",
      "\n",
      "Get meta-features of test-data.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : numpy array, shape = [n_samples, n_features]\n",
      "\n",
      "    Test vectors, where n_samples is the number of samples and\n",
      "    n_features is the number of features.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `meta-features` : numpy array, shape = [n_samples, n_classifiers]\n",
      "\n",
      "    Returns the meta-features for test data.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*predict_proba(X)*\n",
      "\n",
      "Predict class probabilities for X.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : {array-like, sparse matrix}, shape = [n_samples, n_features]\n",
      "\n",
      "    Training vectors, where n_samples is the number of samples and\n",
      "    n_features is the number of features.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `proba` : array-like, shape = [n_samples, n_classes] or a list of                 n_outputs of such arrays if n_outputs > 1.\n",
      "\n",
      "    Probability for each class per sample.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*score(X, y, sample_weight=None)*\n",
      "\n",
      "Return the mean accuracy on the given test data and labels.\n",
      "\n",
      "In multi-label classification, this is the subset accuracy\n",
      "which is a harsh metric since you require for each sample that\n",
      "each label set be correctly predicted.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : array-like of shape (n_samples, n_features)\n",
      "\n",
      "    Test samples.\n",
      "\n",
      "\n",
      "- `y` : array-like of shape (n_samples,) or (n_samples, n_outputs)\n",
      "\n",
      "    True labels for X.\n",
      "\n",
      "\n",
      "- `sample_weight` : array-like of shape (n_samples,), default=None\n",
      "\n",
      "    Sample weights.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `score` : float\n",
      "\n",
      "    Mean accuracy of self.predict(X) wrt. y.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*set_params(**params)*\n",
      "\n",
      "Set the parameters of this estimator.\n",
      "\n",
      "Valid parameter keys can be listed with ``get_params()``.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "self\n",
      "\n",
      "### Properties\n",
      "\n",
      "<hr>\n",
      "\n",
      "*named_classifiers*\n",
      "\n",
      "None\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "with open('../../api_modules/mlxtend.classifier/StackingCVClassifier.md', 'r') as f:\n",
    "    print(f.read())"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  },
  "toc": {
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}